SQL Server Merge Upsert 只做更新,不做插入
SQL Server Merge Upsert only doing Updates and no inserts
我想记录学生在门上刷卡时的动作。每次出现卡片 ID 和名称时,我想检查它是否是学生 table 中尚未存在的新组合。如果不存在,则插入一条新记录,其中 FirstEntry 和 LastEntry 是相同的日期,cardid 和 name 是发送到相应参数的记录。如果组合已经存在,则只更新 [LastEntry] 字段。目前我的查询只更新现有记录,这意味着只有 [LastEntry] 字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。 CardID 和 Name 是 table.
上的复合主键
- 我不想使用 IF Exists(Select...) 方法来实现
这个。
- 我只想使用 MERGE。
- 此操作将在同一个 table 上完成,而不使用任何临时 tables
- 执行操作后,我想在更新或插入方案中查看受影响的记录。仅显示以下字段 [cardid, name, FirstEntry, LastEntry] 而不是 table.
中的其他字段
- table 有其他我不想显示的列或 return。
这是我的声明,它只进行更新
MERGE INTO
Students AS T
USING
(SELECT cardid, name, FirstEntry, LastEntry from Students where cardid = @id and name = @name) AS S
ON
(S.cardid = T.cardid
AND
S.name = T.name)
WHEN MATCHED THEN
UPDATE SET LastEntry = @DT
WHEN NOT MATCHED THEN
INSERT (cardid, name, FirstEntry, LastEntry) VALUES(@id, @name, @DT, @DT )
OUTPUT $action, S.cardid, S.name, S.FirstEntry, S.LastEntry;
除了更新,我希望它也能影响新记录的插入
您的 using
子句不应查询 Students
table。这就是您放置要插入或更新的新值的地方。它应该是这样的:
MERGE INTO
Students AS T
USING
(SELECT @id as cardid, @name as name, @DT as FirstEntry, @DT as LastEntry) AS S
ON
(S.cardid = T.cardid
AND
S.name = T.name)
WHEN MATCHED THEN
UPDATE SET LastEntry = s.LastEntry
WHEN NOT MATCHED THEN
INSERT (cardid, name, FirstEntry, LastEntry) VALUES(s.cardid, s.name, s.FirstEntry, s.LastEntry )
OUTPUT $action, inserted.cardid, inserted.name, inserted.FirstEntry, inserted.LastEntry;
编辑
您的 output
子句可能应该使用 inserted.<col_name>
而不是 S.<col_name>
作为返回的列名以查看新插入或更新的值。如果您想在更新之前查看值,也可以使用 deleted.<col_name>
(对于插入,将是 null
)。
我想记录学生在门上刷卡时的动作。每次出现卡片 ID 和名称时,我想检查它是否是学生 table 中尚未存在的新组合。如果不存在,则插入一条新记录,其中 FirstEntry 和 LastEntry 是相同的日期,cardid 和 name 是发送到相应参数的记录。如果组合已经存在,则只更新 [LastEntry] 字段。目前我的查询只更新现有记录,这意味着只有 [LastEntry] 字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。 CardID 和 Name 是 table.
上的复合主键- 我不想使用 IF Exists(Select...) 方法来实现 这个。
- 我只想使用 MERGE。
- 此操作将在同一个 table 上完成,而不使用任何临时 tables
- 执行操作后,我想在更新或插入方案中查看受影响的记录。仅显示以下字段 [cardid, name, FirstEntry, LastEntry] 而不是 table. 中的其他字段
- table 有其他我不想显示的列或 return。
这是我的声明,它只进行更新
MERGE INTO
Students AS T
USING
(SELECT cardid, name, FirstEntry, LastEntry from Students where cardid = @id and name = @name) AS S
ON
(S.cardid = T.cardid
AND
S.name = T.name)
WHEN MATCHED THEN
UPDATE SET LastEntry = @DT
WHEN NOT MATCHED THEN
INSERT (cardid, name, FirstEntry, LastEntry) VALUES(@id, @name, @DT, @DT )
OUTPUT $action, S.cardid, S.name, S.FirstEntry, S.LastEntry;
除了更新,我希望它也能影响新记录的插入
您的 using
子句不应查询 Students
table。这就是您放置要插入或更新的新值的地方。它应该是这样的:
MERGE INTO
Students AS T
USING
(SELECT @id as cardid, @name as name, @DT as FirstEntry, @DT as LastEntry) AS S
ON
(S.cardid = T.cardid
AND
S.name = T.name)
WHEN MATCHED THEN
UPDATE SET LastEntry = s.LastEntry
WHEN NOT MATCHED THEN
INSERT (cardid, name, FirstEntry, LastEntry) VALUES(s.cardid, s.name, s.FirstEntry, s.LastEntry )
OUTPUT $action, inserted.cardid, inserted.name, inserted.FirstEntry, inserted.LastEntry;
编辑
您的 output
子句可能应该使用 inserted.<col_name>
而不是 S.<col_name>
作为返回的列名以查看新插入或更新的值。如果您想在更新之前查看值,也可以使用 deleted.<col_name>
(对于插入,将是 null
)。