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.

上的复合主键

这是我的声明,它只进行更新

            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)。