2016-11-07 14 views
-2

我有一个SQL Server INSTEAD OF INSERT触发器,它填充我的表中的值。但是,当我运行一个INSERT语句,我得到SQL Server触发器:在区分大小写的数据库中插入'无效的对象名'

无效的对象名称插入“错误

现在我的数据库排序规则设置为区分大小写的,所以我不知道是否该'插入'的情况是原因,但我试过插入,插入和插入。

我的触发类似于:

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 
+7

为什么你使用动态SQL - 在这里似乎没有必要。 –

+1

不仅是不必要的,而且是错误的原因... – petelids

+1

为什么要在同一个表格触发器的'Personnel'表中插入记录?它会创建递归。 – Shell

回答

4

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

inserted不可用,这并不奇怪。简单的解决办法是不使用动态SQL:

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

另外请注意,无论你使用一个字符类型,你应该始终使用的长度。默认长度因上下文而异。如果时间不够长,那么你的代码将会有很难找到的错误。