SQL Server触发器:区分大小写的数据库中的“插入”对象名称无效

时间:2016-11-07 12:11:37

标签: sql-server tsql triggers

我有一个SQL Server INSTEAD OF INSERT触发器,用于填充表格中的值。但是当我运行一个insert语句时,我得到了错误

  

无效的对象名称'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

1 个答案:

答案 0 :(得分:4)

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

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

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

另请注意,无论何时使用字符类型,都应始终使用长度。默认长度因上下文而异。如果时间不够长,那么您的代码将难以找到错误。