Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server合并升级只执行更新,不执行插入_Sql_Sql Server_Upsert - Fatal编程技术网

SQL Server合并升级只执行更新,不执行插入

SQL Server合并升级只执行更新,不执行插入,sql,sql-server,upsert,Sql,Sql Server,Upsert,我想记录学生刷卡时的动作。每次出示卡片id和姓名时,我都想检查它是否是一个新的组合,而该组合尚未出现在学生表中。如果不存在,则插入一条新记录,其中FirstEntry和LastEntry的日期相同,cardid和name是发送到相应参数的记录。如果组合已存在,则仅更新[LastEntry]字段。目前,我的查询只是更新现有记录,这意味着只有[LastEntry]字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。CardID和Name是表中的复合主键 我不想使用IF Exists

我想记录学生刷卡时的动作。每次出示卡片id和姓名时,我都想检查它是否是一个新的组合,而该组合尚未出现在学生表中。如果不存在,则插入一条新记录,其中FirstEntry和LastEntry的日期相同,cardid和name是发送到相应参数的记录。如果组合已存在,则仅更新[LastEntry]字段。目前,我的查询只是更新现有记录,这意味着只有[LastEntry]字段得到更新。对于更新,这是正常的。但是,它不会为新条目插入新记录。CardID和Name是表中的复合主键

  • 我不想使用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.
查看新值,或两者的组合(如果同时使用这两个值,请确保为列别名,以避免输出时出现不明确的列名)