当一个触发器运行时,插入和删除表中的行数可能是非零(基本上是同时处理插入和更新的混合)?
例如,inserted表可能有2行,delete会有1行(匹配插入的1行),这意味着触发器正在处理1更新的混合(插入和删除表中的匹配行)和1个插入。
更新
显然使用 merge
命令可能会导致1个触发器针对所做的所有更改运行,请参阅:Merge statement and after triggers on target table或者不需要对此进行测试。
根据https://www.mssqltips.com/sqlservertip/3074/use-caution-with-sql-servers-merge-statement/
merge
命令导致触发器多次运行,分离更新和插入。
解决方案更新
假设this是DML操作的完整列表,那么在同一触发器运行中将会出现混合插入和更新的情况永远不会出现这种情况。
答案 0 :(得分:1)
不,这是不可能的。
您可以从下面看到它的工作原理。
CREATE TABLE T1
(
X INT
)
INSERT INTO T1
VALUES (1);
GO
CREATE TRIGGER TR
ON T1
FOR UPDATE, INSERT
AS
SELECT (SELECT COUNT(*)
FROM inserted) AS InsertedCount,
(SELECT COUNT(*)
FROM deleted) AS DeletedCount
GO
MERGE INTO T1
USING (VALUES (1),
(2),
(3)) V(X)
ON T1.X = V.X
WHEN MATCHED THEN
UPDATE SET X = V.X
WHEN NOT MATCHED THEN
INSERT (X)
VALUES (X);
返回两个结果集。一个用于插入,另一个用于更新。