Sql server SQL Server触发器:无效的对象名称';插入';在区分大小写的数据库中

Sql server SQL Server触发器:无效的对象名称';插入';在区分大小写的数据库中,sql-server,tsql,triggers,Sql Server,Tsql,Triggers,我有一个SQL Server而不是INSERT触发器来填充表中的值。但是当我运行insert语句时,我得到的错误是 无效的对象名称“已插入” 现在我的数据库排序规则设置为区分大小写,所以我不确定“inserted”的大小写是否是原因,但我已经尝试了inserted、inserted和inserted 我的触发器看起来像: CREATE TRIGGER UpdateID ON Personnel INSTEAD OF INSERT AS BEGIN DECLARE

我有一个SQL Server
而不是INSERT
触发器来填充表中的值。但是当我运行insert语句时,我得到的错误是

无效的对象名称“已插入”

现在我的数据库排序规则设置为区分大小写,所以我不确定“inserted”的大小写是否是原因,但我已经尝试了inserted、inserted和inserted

我的触发器看起来像:

CREATE TRIGGER UpdateID   
ON Personnel   
INSTEAD OF INSERT   
AS 
BEGIN   
    DECLARE @SQL nvarchar(4000)     
    DECLARE @NewID int = 100 --Will be auto generated

    SET @SQL = 'INSERT INTO Personnel (AutoID, Firstname, Surname)
                SELECT ' + CAST(@NewID AS nvarchar) + ', Firstname, Surname
                FROM inserted'  
    EXECUTE (@SQL) 
END
动态SQL创建了一个新的“上下文”,其中调用代码块中的变量和表可能不可用

inserted
不可用一点也不奇怪。简单的解决方案是不使用动态SQL:

INSERT INTO Personnel (AutoID, Firstname, Surname)
    SELECT CAST(@NewID AS nvarchar(255)), Firstname, Surname
    FROM inserted; 
还请注意,无论何时使用字符类型,都应始终使用长度。默认长度因上下文而异。当它不够长时,代码将很难找到bug。

动态SQL会创建一个新的“上下文”,其中调用代码块中的变量和表可能不可用

inserted
不可用一点也不奇怪。简单的解决方案是不使用动态SQL:

INSERT INTO Personnel (AutoID, Firstname, Surname)
    SELECT CAST(@NewID AS nvarchar(255)), Firstname, Surname
    FROM inserted; 

还请注意,无论何时使用字符类型,都应始终使用长度。默认长度因上下文而异。当它不够长时,您的代码将很难找到bug。

为什么要使用动态SQL?这在这里似乎是不必要的。不仅是不必要的,而且是错误的原因……为什么要在同一个表触发器上的
personal
表中插入记录?使用动态sql的原因是我还生成了一个列名列表,这样在向表中添加新列时就不必维护触发器。为简单起见,我省略了这一部分,但我注意到您在中所说的是问题的原因。为什么您使用动态SQL?这在这里似乎是不必要的。不仅不必要,而且是错误的原因…为什么您要在同一个表触发器上的
personals
表中插入记录?使用动态sql的原因是我还生成了一个列名列表,这样在向表中添加新列时就不必维护触发器。为简单起见,我省略了这一部分,但我注意到,您在其中所说的是问题的原因。