在 SQL Server 2012 中使用 Merge with Trigger

Using Merge with Trigger in SQL Server 2012

我遇到了与合并语句相关的问题我有这样的合并语句

MERGE abc A 
USING xyz B ON A.trans_date = b.trans_date 

WHEN matched AND B.trans_date IS NOT NULL 
   THEN 
       UPDATE 
          SET A.column1 = B.column1, 
              A.column2 = B.column2, 
              A.column3 = B.column3 

WHEN NOT matched BY target AND B.trans_date IS NOT NULL 
   THEN 
      INSERT (column1, column2, column3) 
      VALUES (column1, column2, column3); 

并且像这样在 table ABC 上触发

ALTER TRIGGER [dbo].[TRG_ABC] 
ON [dbo].[Z_ABC] 
FOR UPDATE 
AS 
    DECLARE @Column4 NUMERIC(9), @Column5 CHAR(1)

    SELECT @Column4 = Column4, @Column5 = Column5 
    FROM inserted 

    UPDATE ABC 
    SET Column5 = CASE 
                     WHEN @Column5 = 'S' 
                        THEN 'Y' 
                        ELSE CASE
                                WHEN @Column5 = 'N' 
                                   THEN 'N' 
                                   ELSE 'U' 
                             END
                  END 
    WHERE Column4 = @Column4

此触发器不适用于更新每一行。更新每一行的代码或解决方案有什么问题吗?

在Sql 服务器中,Trigger 将在语句级别而不是行级别调用。所以 Inserted 魔术 table 将拥有所有 updated/inserted 记录。

像这样改变触发器

UPDATE a
SET    Column5 = CASE
                   WHEN Column5 = 'S' THEN 'Y'
                   WHEN Column5 = 'N' THEN 'N'
                   ELSE 'U'
                 END
FROM   ABC a
       INNER JOIN inserted i
               ON i.Column4 = a.Column4 

触发器中的代码应包含基于 SET 的操作

您已声明变量,这将导致仅使用最后受影响的行数据

所以你的内部更新会导致错误的结果

可以参考merge command in trigger

的用法