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

Posted

技术标签:

【中文标题】SQL Server 触发器:在区分大小写的数据库中“插入”的对象名称无效【英文标题】:SQL Server trigger: Invalid object name 'inserted' in case sensitive database 【发布时间】:2016-11-07 12:11:36 【问题描述】:

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

无效的对象名称“插入”

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

我的触发器看起来像:

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 - 这在这里似乎没有必要。 不仅没有必要,而且错误的原因... 为什么要在同一表触发器的Personnel 表中插入记录?它将创建递归。 动态sql的原因是我还生成了一个列名列表,这样当新的列添加到表中时我就不必维护触发器了。为简单起见,我省略了那部分,但我注意到你所说的就是问题的原因。 【参考方案1】:

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

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

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

还要注意,无论何时使用字符类型,都应该始终使用长度。默认长度因上下文而异。如果时间不够长,那么您的代码就会出现难以发现的错误。

【讨论】:

以上是关于SQL Server 触发器:在区分大小写的数据库中“插入”的对象名称无效的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 检查是不是区分大小写?

sql server数据库区分大小写

SQL Server 列名区分大小写

如何使用 Sql Server XQuery 搜索不区分大小写的单词?

MySQL

通过 C# 查询时 SQL Server 2005 区分大小写