在SQL Server 2012中使用带触发器的合并

在SQL Server 2012中使用带触发器的合并,sql,sql-server,database,database-trigger,Sql,Sql Server,Database,Database Trigger,我面临一个与merge语句相关的问题,我有这样的merge语句 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.c

我面临一个与merge语句相关的问题,我有这样的merge语句

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); 
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 
在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 Server中,触发器将在语句级别而不是行级别调用。因此,插入的魔法表将包含所有更新/插入的记录

像这样改变触发器

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); 
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 
在Sql Server中,触发器将在语句级别而不是行级别调用。因此,插入的魔法表将包含所有更新/插入的记录

像这样改变触发器

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

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

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

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


您可以参考触发器中代码的用法,该代码应包含基于集合的操作

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

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

您可以参考