在 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 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 的操作
您已声明变量,这将导致仅使用最后受影响的行数据
所以你的内部更新会导致错误的结果
的用法