如何在INSERT语句中使用OUTPUT子句输出$ACTION?
如何在INSERT操作中获取操作类型?
为啥报错?
$ACTION 是SQL Server里MERGE语句独有的内置标识,只有在MERGE的OUTPUT子句里才能用,用来区分是INSERT、UPDATE还是DELETE操作。直接在INSERT语句里引用$ACTION,SQL Server会识别成无效列名,所以触发报错。
两种正确实现方法
方法1:纯INSERT场景直接输出固定值
如果只是单纯执行INSERT操作,直接在OUTPUT子句里输出固定的'INSERT'即可;要是需要把操作类型和插入的数据一起存入临时表,记得给临时表新增存储操作类型的字段:
DECLARE @OutputTbl TABLE (ActionType nvarchar(10), Id int, FirstName nvarchar(50), City nvarchar(50)) INSERT @OutputTbl (Id, FirstName, City) OUTPUT 'INSERT' AS ActionType, inserted.* VALUES (1,'John','Jackson') SELECT * FROM @OutputTbl
方法2:用MERGE兼容多操作场景
如果后续需要统一处理INSERT、UPDATE、DELETE等多种数据操作,改用MERGE语句就能合法使用$ACTION了:
DECLARE @OutputTbl TABLE (ActionType nvarchar(10), Id int, FirstName nvarchar(50), City nvarchar(50)) DECLARE @SourceTbl TABLE (Id int, FirstName nvarchar(50), City nvarchar(50)) INSERT INTO @SourceTbl VALUES (1,'John','Jackson') MERGE INTO @OutputTbl AS Target USING @SourceTbl AS Source ON Target.Id = Source.Id WHEN NOT MATCHED THEN INSERT (Id, FirstName, City) VALUES (Source.Id, Source.FirstName, Source.City) OUTPUT $ACTION AS ActionType, inserted.*; SELECT * FROM @OutputTbl
小提示
- 方法1简单直接,适合仅执行INSERT的场景,无需额外创建源表。
- 方法2适用于需要统一处理多种DML操作的场景,
$ACTION会自动返回对应的操作类型。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

