我有简单的MS SQL触发器,由于某种原因,它无法识别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
所以我看到插入行确实存在。但是,如果我删除对[[插入语句的注释,则输出为:
Msg 4104, Level 16, State 1, Procedure trg_a, Line 14 [Batch Start Line 16]
The multi-part identifier "inserted.id" could not be bound.
Msg 4104, Level 16, State 1, Procedure trg_a, Line 14 [Batch Start Line 16]
The multi-part identifier "inserted.v" could not be bound.
(1 row affected)
(1 row affected)
(2 rows affected)
done
怎么了?
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;