在SQL Server 2012中使用带触发器的合并
我面临一个与merge语句相关的问题,我有这样的merge语句在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 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
触发器中的代码应包含基于集合的操作 您已经声明了变量,这将导致仅使用最后一个受影响的行数据 所以你的内部更新会导致错误的结果
您可以参考触发器中代码的用法,该代码应包含基于集合的操作 您已经声明了变量,这将导致仅使用最后一个受影响的行数据 所以你的内部更新会导致错误的结果 您可以参考