我在我的桌子上有一个触发器。
CREATE TRIGGER HIE.AI_IB_Export_Events
ON HIE.IB_Export_Events
INSTEAD OF INSERT
及其后面的行是:
IF @@ROWCOUNT = 0 RETURN
这不是必需的吗?如果没有插入行,如何获得插入触发器?
为什么我们会对插入物执行此类检查?对于没有记录匹配where条件的更新查询,我可以理解相同的内容。
如果这些条件到达@@ ROWCOUNT = 0的情况,那么在哪种情况下会发生这种情况?
先谢谢。
答案 0 :(得分: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
如果然后运行void insert语句,您仍然会看到一条消息:
INSERT INTO Test
SELECT 1 WHERE 0 = 1
>> 0 rows inserted (trigger).
请注意,INSTEAD OF INSERT
和AFTER INSERT
触发器都会发生这种情况。这种行为是有道理的,因为插入0行仍然是一个插入操作(虽然不是很令人兴奋)。
如果插入的行数为0,您应该检查并提前返回吗?我会说这取决于你的触发器的功能和对插入的行的期望(例如,它会发生,如果是的话,后果是什么?)。
如果你的触发器只是执行插入行的映射然后执行另一个插入,那么检查并不重要。但是,如果您的触发器触发某些业务逻辑或执行一些复杂操作来准备插入的行,那么检查可能有意义。