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 触发器:在区分大小写的数据库中“插入”的对象名称无效的主要内容,如果未能解决你的问题,请参考以下文章