INSTEAD OF INSERT 触发器内的 SET IDENTITY_INSERT 不起作用

Rod*_*iro 5 t-sql

我正在尝试在而不是插入触发器中执行身份插入,但是当我尝试将数据插入数据时,它会抛出错误消息“消息 544,级别 16,状态 1,第 36 行无法插入身份的显式值IDENTITY_INSERT 设置为 OFF 时表 'PixTest' 中的列。”。

我正在使用安装在 Windows 8 64 位上的 SQL SERVER 2014 Developer Edition 64 位。

以下是一些可能有帮助的示例代码:

CREATE TABLE PixTest
(
      ID INT IDENTITY(1,1) NOT NULL PRIMARY KEY,
      TESTE VARCHAR(10)
)
GO

CREATE TRIGGER AutoIncrement_Trigger ON PixTest
instead OF INSERT AS
BEGIN

    DECLARE @ID INT;
    SELECT @ID=ID FROM inserted;



    IF COALESCE(@ID,0)<> 0
        BEGIN

            SET IDENTITY_INSERT PixTest ON
            INSERT INTO PixTest(ID, TESTE) 
            SELECT ID,TESTE FROM inserted
            SET IDENTITY_INSERT PixTest off

        END

    ELSE

        INSERT INTO PixTest(Teste) 
        SELECT TESTE FROM inserted;

END;
go

INSERT INTO PixTest(ID, TESTE) VALUES (1, 'TESTE 1')
GO
Run Code Online (Sandbox Code Playgroud)

我搜索了关于在触发器内使用 SET IDENTITY_INSERT 的信息,但找不到任何说明这是不可能的,但上面的代码似乎不起作用。

有任何想法吗?

Ken*_*her 2

该错误不是来自触发器。它来自您的插入语句。

INSERT INTO PixTest(ID, TESTE) VALUES (1, 'TESTE 1')
Run Code Online (Sandbox Code Playgroud)

在您到达触发器之前,它会被解析并返回错误。改成这个就可以了。

INSERT INTO PixTest(TESTE) VALUES ('TESTE 1')
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用“UPDATE(column)”函数判断是否正在将值插入到表中。然而它仍然行不通。如果您尝试插入到标识列中,它会在到达触发器之前抛出错误。您可以使用“TRY CATCH”来检查它,但同样不要在触发器内。 (3认同)