为什么"IF @@ ROWCOUNT = 0 RETURN"用于代替插入触发器?

Ram*_*hta 2 t-sql sql-server triggers

我的桌子上有一个触发器.

CREATE TRIGGER HIE.AI_IB_Export_Events 
   ON HIE.IB_Export_Events 
INSTEAD OF INSERT
Run Code Online (Sandbox Code Playgroud)

它后面的行是:

IF @@ROWCOUNT = 0 RETURN
Run Code Online (Sandbox Code Playgroud)

这不是必需的吗?如果没有插入行,如何进入插入触发器?

为什么我们要对插入物执行此类检查?对于没有记录匹配where条件的更新查询,我可以理解相同的内容.

如果这些条件到达@@ ROWCOUNT = 0的情况,那么在哪种情况下会发生这种情况?

提前致谢.

Mic*_*ito 5

要回答插入触发器是否会在插入0行时触发,我创建了一个简单的表并触发:

CREATE TABLE Test (Id INT PRIMARY KEY)
GO

CREATE TRIGGER Test_Trigger ON Test INSTEAD OF INSERT
AS
BEGIN
DECLARE @Msg nvarchar(4000);
SELECT @Msg = CONVERT(NVARCHAR, @@ROWCOUNT) + N' rows inserted (trigger).';
PRINT @Msg;
END
GO
Run Code Online (Sandbox Code Playgroud)

如果然后运行void insert语句,您仍会看到一条消息:

INSERT INTO Test
SELECT 1 WHERE 0 = 1

>> 0 rows inserted (trigger).
Run Code Online (Sandbox Code Playgroud)

请注意,对于both INSTEAD OF INSERTAFTER INSERT触发器都会发生这种情况.这种行为是有道理的,因为0行的插入仍然是插入操作(虽然不是非常令人兴奋的).

如果插入的行数为0,您应该检查并提前返回吗?我会说这取决于你的触发器的功能和对插入的行的期望(例如它会发生,如果是的话,结果是什么?).

如果您的触发器只是执行插入行的映射然后执行另一个插入,则检查并不重要.但是,如果您的触发器触发某些业务逻辑或执行一些复杂操作来准备插入的行,那么检查可能有意义.