SQL触发器内INSERT与UPDATE语句执行顺序确认请求
关于AFTER INSERT触发器内语句执行顺序的解答
嘿,答案很明确:你的触发器里的语句一定会按照先INSERT、后UPDATE的顺序执行。
原因说明
SQL Server中,触发器内部的Transact-SQL语句是按照你编写的从上到下的顺序依次执行的,除非你使用了GOTO、IF...ELSE这类控制流语句改变执行流程。你的触发器代码里没有这类控制逻辑,所以完全会按照你写的顺序先执行插入Field_ElementID的操作,再执行更新AttributeValues的操作。
另外补充一点:这个AFTER INSERT触发器是在原表AttributeValues的INSERT操作完全完成之后才会触发执行的,所以你在触发器里读取AttributeValues的新数据是没问题的。
你的触发器代码回顾
GO CREATE TRIGGER [FieldID] ON [Field].[AttributeValues] AFTER INSERT AS INSERT INTO [Field].[Field_ElementID] (Path) SELECT DISTINCT Path FROM [Field].[AttributeValues] WHERE Path NOT IN (SELECT Path FROM [Field].[Field_ElementID]) UPDATE [Field].[AttributeValues] SET PathID = (SELECT Id FROM [Field].[Field_ElementID] WHERE [Field].[AttributeValues].[Path] = [Field].[Field_ElementID].[Path]) WHERE PathID IS NULL GO
小提示:其实可以考虑用MERGE语句来替换那个INSERT,避免重复判断;另外,更新的时候如果Field_ElementID里的Path不唯一,可能会出现“子查询返回多个值”的报错,最好确保Field_ElementID的Path字段是唯一约束或者加上TOP 1来避免这类问题哦。
内容的提问来源于stack exchange,提问作者Joe Green




