- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下代码显示了两个 WHEN MATCHED
子句。当只有 DATETIME
列“updatedAt”发生变化时,第一个匹配。这应该会更新目标,但是我不想在 OUTPUT
中标记它。当给定匹配中有其他更改时,第二个匹配,这应该导致 OUTPUT
。
MERGE [Target].dbo.[clients] AS target
USING [Source].dbo.[clients] AS source
ON target.[objectId]=source.[objectId]
WHEN MATCHED AND NOT EXISTS (
SELECT source.firstName, ...
EXCEPT
SELECT target.firstName, ...
) AND source.updatedAt <> target.updatedAt
THEN
UPDATE SET --THIS UPDATE SHOULD NOT LEAD TO AN OUTPUT WITH $ACTION = 'UPDATE'
target.updatedAt = source.updatedAt
WHEN MATCHED AND EXISTS (
SELECT source.firstName, ... , source.updatedAt
EXCEPT
SELECT target.firstName, ... , target.updatedAt
)
THEN
UPDATE SET --THIS UPDATE SHOULD LEAD TO AN OUTPUT WITH $ACTION = 'UPDATE'
target.[firstName]=source.[firstName], ...
WHEN NOT MATCHED BY TARGET
THEN
INSERT ([objectId],[firstName], ... ,[updatedAt]) VALUES ([objectId],[firstName], ... ,[updatedAt])
WHEN NOT MATCHED BY SOURCE
THEN
DELETE
OUTPUT
$ACTION ChangeType
, ISNULL(
inserted.objectId
, deleted.objectId
) AS objectId
, GETDATE() AS DateTimeChanged
;
这可以通过输出所有源列和目标列并将 MERGE
放在子查询中来实现,以便在主查询中进行比较,例如:
WHERE NOT (
[ChangeType]='UPDATE'
AND [src objectId]=[tgt objectId]
AND [src firstName]=[tgt firstName]
AND ...
AND [src updatedAt]<>[tgt updatedAt]
)
但是,我觉得应该有更好的方法,因为我可以声明两个不同的 WHEN MATCHED
子句。有没有更好的办法?
最佳答案
我认为您的示例不正确,因为您有两个条件 WHEN MATCHED 子句。
根据在线图书:Merge (强调我的)
WHEN MATCHED THEN < merge_matched >
Specifies that all rows of *target_table, which match the rows returned by ON , and satisfy any additional search condition, are either updated or deleted according to the clause.The MERGE statement can have, at most, two WHEN MATCHED clauses. If two clauses are specified, the first clause must be accompanied by an AND clause. For any given row, the second WHEN MATCHED clause is only applied if the first isn't. If there are two WHEN MATCHED clauses, one must specify an UPDATE action and one must specify a DELETE action. When UPDATE is specified in the clause, and more than one row of matches a row in target_table based on , SQL Server returns an error. The MERGE statement can't update the same row more than once, or update and delete the same row.
我也试过你的代码
BEGIN TRANSACTION
SET XACT_ABORT ON;
CREATE TABLE TargetClients
(
objectId BIGINT
, firstName VARCHAR(50)
, updatedAt DATETIME2(0)
)
CREATE TABLE SourceClients
(
objectId BIGINT
, firstName VARCHAR(50)
, updatedAt DATETIME2(0)
)
go
MERGE TargetClients AS target
USING SourceClients AS source
ON target.[objectId]=source.[objectId]
WHEN MATCHED AND NOT EXISTS (
SELECT source.firstName
EXCEPT
SELECT target.firstName
) AND source.updatedAt <> target.updatedAt
THEN
UPDATE SET --THIS UPDATE SHOULD NOT LEAD TO AN OUTPUT WITH $ACTION = 'UPDATE'
target.updatedAt = source.updatedAt
WHEN MATCHED AND EXISTS (
SELECT source.firstName, source.updatedAt
EXCEPT
SELECT target.firstName, target.updatedAt
)
THEN
UPDATE SET --THIS UPDATE SHOULD LEAD TO AN OUTPUT WITH $ACTION = 'UPDATE'
target.[firstName]=source.[firstName]
WHEN NOT MATCHED BY TARGET
THEN
INSERT ([objectId],[firstName], [updatedAt]) VALUES ([objectId],[firstName], [updatedAt])
WHEN NOT MATCHED BY SOURCE
THEN
DELETE
OUTPUT
$ACTION ChangeType
, ISNULL(
inserted.objectId
, deleted.objectId
) AS objectId
, GETDATE() AS DateTimeChanged
;
rollback
它告诉我错误
Msg 10714, Level 15, State 1, Line 33 An action of type 'WHEN MATCHED' cannot appear more than once in a 'UPDATE' clause of a MERGE statement.
一个可能的解决方案是在 Merge_matched
子句中使用 CASE 语句,并使用一个额外的列作为标志。
关于tsql - MERGE - 条件 "WHEN MATCHED"输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41871155/
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
它具有看似简单的代码: method match(Any:U: |) { self.Str; nqp::getlexcaller('$/') = Nil } 但是,这是它的行为: (^3).matc
如果您想检查某项是否与正则表达式匹配,如果是,请打印第一组,您就可以了.. import re match = re.match("(\d+)g", "123g") if match is not N
以下两个查询的结果有差异吗? SELECT * FROM table1, table2 WHERE ( MATCH(table1.row1) AGAINST('searchstring' IN
我正在尝试为我的日志文件创建一个语法文件。它们采用以下格式: [time] LEVEL filepath:line - message 我的语法文件如下所示: :syn region logTime
String#match 和 Regexp#match 在匹配成功时返回一个 MatchData: "".match(//) # => # //.match("") # => # //.match(:
我的代码中有这个函数: func match(match: GKMatch, player playerID: String, didChangeState state: GKPlayerConnec
我对 match 和 case 之间的区别感到困惑。在 document ,其中提到match支持通用模式匹配。 > (define (m x) (match x [(list a
我在检查特定元素中的空 HTML 内容时遇到了问题。当我使用 someElement.trim().match("") 即使 HTML 内容为空,我有时也会得到 true。我改成了 someEleme
我正在尝试使用正则表达式查找包含特定词的两个词之间的所有内容,但是这些词是重复的,所以我没有得到我想要的匹配项。 例如,我想要“你好”和“再见”之间的所有内容,以便它们之间存在“苹果”一词: hell
我目前正在构建一个 PHP 脚本,它将在需要时响应 HTTP“304 Not Modified”。 (请参阅 question #2086712 了解我目前所做的事情)。 目前我回答以下问题: If-
给定以下 XML 10 我希望能够正确识别内部 的 s : result = subject.gsub(/]*>)/, '<') 解释: ]* # any number of charact
这个问题在这里已经有了答案: How to error handle 1004 Error with WorksheetFunction.VLookup? (3 个回答) 3年前关闭。 目标:查找输入
我已经尝试了好一阵子了,但是我似乎无法弄清楚这两者之间的区别。特别是,与数据数组有关的差异: PS C:>$myarray = "a", "ab", "abc" PS C:>$myarray -mat
我正在努力研究如何构建一个宏,让我可以将模式和结果以向量的形式传递给 core.match/match 。我希望能够做到这一点: (let [x {:a 1} patterns [[{:a
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 8 年前。 如果这看起来微不足道但只是为了理解正则表达式,请原谅我:
我的 MySQL 表中有大约 20 行,其 Title 列为 Elsewhere 并具有其他不同的列参数。 我目前正在使用这样的查询,因为我的大多数搜索(通过 PHP 文件)都需要我进行猜测。所以我使
当找到匹配时,我必须从字符串中删除单词 让我们看看 我的输入字符串是 “肯诺克斯路” 比赛表演中的单词表 街道 驾驶 道路 4. 车道 输出字符串应该是: KENOX 我正在使用 vb.net 作为此
我正在搜索以下形式的字符串模式: XXXAXXX # exactly 3 Xs, followed by a non-X, followed by 3Xs 所有的 X 必须是相同的字符,并且 A 不能
好吧,我是 gulp 和 sass 的新手,我正在努力让它发挥作用。我正确安装了所有东西,但我收到了这个愚蠢的错误。有解决办法吗? PS C:\Users\Bojan Kolano\Desktop\F
我是一名优秀的程序员,十分优秀!