SQL Server合并升级只执行更新,不执行插入
我想记录学生刷卡时的动作。每次出示卡片id和姓名时,我都想检查它是否是一个新的组合,而该组合尚未出现在学生表中。如果不存在,则插入一条新记录,其中FirstEntry和LastEntry的日期相同,cardid和name是发送到相应参数的记录。如果组合已存在,则仅更新[LastEntry]字段。目前,我的查询只是更新现有记录,这意味着只有[LastEntry]字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。CardID和Name是表中的复合主键SQL Server合并升级只执行更新,不执行插入,sql,sql-server,upsert,Sql,Sql Server,Upsert,我想记录学生刷卡时的动作。每次出示卡片id和姓名时,我都想检查它是否是一个新的组合,而该组合尚未出现在学生表中。如果不存在,则插入一条新记录,其中FirstEntry和LastEntry的日期相同,cardid和name是发送到相应参数的记录。如果组合已存在,则仅更新[LastEntry]字段。目前,我的查询只是更新现有记录,这意味着只有[LastEntry]字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。CardID和Name是表中的复合主键 我不想使用IF Exists
- 我不想使用IF Exists(Select…)方法来实现 这个李>
- 我只想使用合并李>
- 此操作将在同一个表上执行,而不使用任何临时表
- 执行操作后,我希望在更新或插入场景中查看受影响的记录。仅显示以下字段[cardid、name、FirstEntry、LastEntry],而不显示表中的其他字段
- 该表还有其他我不想显示或返回的列
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
表。这是放置要插入或更新的新值的位置。应该是这样的:
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.
而不是S.
来查看返回的列名,以查看新插入或更新的值。您还可以使用deleted.
如果您想在值更新之前查看它(对于insert,它将是null
。那么,您的问题是什么?您的选择完全按照您告诉它的做。如果带有键@id、@name
的记录不存在,它将不插入任何内容。已更新问题Nicky@Aツ 如何更改它以满足我的要求?如果没有,那就意味着没有对手,对吗?那它为什么不插入呢?我不应该在这里得到旧的最后一个条目,而不仅仅是我发送的值吗?。我认为在更新的情况下,我也可以在更新发生之前获得旧的值。这可行吗?你决定你想看什么。您可以使用deleted.
查看旧值(对于insert
当然将为null
),也可以使用inserted.
查看新值,或两者的组合(如果同时使用这两个值,请确保为列别名,以避免输出时出现不明确的列名)