You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

SQL触发器内INSERT与UPDATE语句执行顺序确认请求

关于AFTER INSERT触发器内语句执行顺序的解答

嘿,答案很明确:你的触发器里的语句一定会按照先INSERT、后UPDATE的顺序执行

原因说明

SQL Server中,触发器内部的Transact-SQL语句是按照你编写的从上到下的顺序依次执行的,除非你使用了GOTOIF...ELSE这类控制流语句改变执行流程。你的触发器代码里没有这类控制逻辑,所以完全会按照你写的顺序先执行插入Field_ElementID的操作,再执行更新AttributeValues的操作。

另外补充一点:这个AFTER INSERT触发器是在原表AttributeValuesINSERT操作完全完成之后才会触发执行的,所以你在触发器里读取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_ElementIDPath字段是唯一约束或者加上TOP 1来避免这类问题哦。

内容的提问来源于stack exchange,提问作者Joe Green

火山引擎 最新活动