SQL Server触发器无法识别插入的行



我有一个简单的SQL Server触发器,由于某种原因,它无法识别INSERTED行。

这是代码:

-- code
DROP TABLE a;
GO
CREATE TABLE a 
(
id INT IDENTITY(1,1) PRIMARY KEY,
v INT
)
GO
DROP TABLE a_audit;
CREATE TABLE a_audit 
(
id INT,
v INT,
[updated_at] [DATETIME] NOT NULL DEFAULT GETDATE()
)
GO
CREATE TRIGGER [dbo].[trg_a]
ON [dbo].[a]
AFTER INSERT, UPDATE, DELETE
NOT FOR REPLICATION
AS
BEGIN
SET NOCOUNT ON;
PRINT 'start';
DECLARE @xmltmp xml = (SELECT * FROM inserted FOR XML AUTO);
PRINT CONVERT(NVARCHAR(MAX), @xmltmp);
-- INSERT INTO a_audit (id, v) VALUES (inserted.id, inserted.v);
END;
GO
INSERT INTO a (v) 
VALUES (1);
WAITFOR DELAY '00:00:01.11';
INSERT INTO a (v) 
VALUES (2);
GO
SELECT * FROM a;
PRINT 'done'

它产生这个输出

start
<inserted id="1" v="1"/>
(1 row affected)
start
<inserted id="2" v="2"/>
(1 row affected)
(2 rows affected)
done

所以我看到INSERTED行确实存在。

但是,如果我删除insert语句上的注释,则输出为:

Msg 4104,Level 16,State 1,Procedure trg_a,Line 14[Batch Start Line 16]
无法绑定多部分标识符"inserted.id"。

Msg 4104,Level 16,State 1,Procedure trg_a,Line 14[Batch Start Line 16]
无法绑定多部分标识符"inserted.v"。

怎么了?

inserted是一个表,而不是函数。要从另一个表中获取INSERT,您需要使用INSERT INTO... SELECT ... FROM语句:

INSERT INTO a_audit (id,v)
SELECT id,
v
FROM inserted;

除非使用FROM,否则不能引用表的列。例如,仅运行以下程序就会出现以下错误:

SELECT a_audit.id, a.audit.v;

无法绑定多部分标识符"a_audit.id"。

您必须使用SELECT...FROM:

SELECT id, v
FROM a_audit;

最新更新