为什么 "IF @@ROWCOUNT = 0 RETURN" 用于 Instead of Insert 触发器?
Why is "IF @@ROWCOUNT = 0 RETURN" used in Instead of Insert trigger?
我的 table 有一个触发器。
CREATE TRIGGER HIE.AI_IB_Export_Events
ON HIE.IB_Export_Events
INSTEAD OF INSERT
它后面的几行是:
IF @@ROWCOUNT = 0 RETURN
这不是必须的吗?如果未插入行,您如何获得插入触发器?
为什么我们要对插入执行此类检查?对于没有记录匹配 where 条件的更新查询,我可以理解相同的情况。
如果这样的情况出现在@@ROWCOUNT = 0 的地方,那么在什么情况下会发生这种情况?
提前致谢。
为了回答插入触发器是否会在插入 0 行时触发,我创建了一个简单的 table 和触发器:
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
如果您随后 运行 一个无效的插入语句,您仍然会看到一条消息:
INSERT INTO Test
SELECT 1 WHERE 0 = 1
>> 0 rows inserted (trigger).
请注意,INSTEAD OF INSERT
和 AFTER INSERT
触发器都会发生这种情况。这种行为是有道理的,因为插入 0 行仍然是插入操作(尽管不是很令人兴奋)。
如果插入的行数为 0,您是否应该尽早检查 return?我会说这取决于您的触发器的功能和对插入行的期望(例如,它会发生吗?如果发生,后果是什么?)。
如果您的触发器只是执行插入行的映射,然后执行另一次插入,则检查并不重要。但是,如果您的触发器正在触发一些业务逻辑或执行一些复杂的操作来准备插入的行,那么检查可能有意义。
我的 table 有一个触发器。
CREATE TRIGGER HIE.AI_IB_Export_Events
ON HIE.IB_Export_Events
INSTEAD OF INSERT
它后面的几行是:
IF @@ROWCOUNT = 0 RETURN
这不是必须的吗?如果未插入行,您如何获得插入触发器?
为什么我们要对插入执行此类检查?对于没有记录匹配 where 条件的更新查询,我可以理解相同的情况。
如果这样的情况出现在@@ROWCOUNT = 0 的地方,那么在什么情况下会发生这种情况?
提前致谢。
为了回答插入触发器是否会在插入 0 行时触发,我创建了一个简单的 table 和触发器:
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
如果您随后 运行 一个无效的插入语句,您仍然会看到一条消息:
INSERT INTO Test
SELECT 1 WHERE 0 = 1
>> 0 rows inserted (trigger).
请注意,INSTEAD OF INSERT
和 AFTER INSERT
触发器都会发生这种情况。这种行为是有道理的,因为插入 0 行仍然是插入操作(尽管不是很令人兴奋)。
如果插入的行数为 0,您是否应该尽早检查 return?我会说这取决于您的触发器的功能和对插入行的期望(例如,它会发生吗?如果发生,后果是什么?)。
如果您的触发器只是执行插入行的映射,然后执行另一次插入,则检查并不重要。但是,如果您的触发器正在触发一些业务逻辑或执行一些复杂的操作来准备插入的行,那么检查可能有意义。