我遇到更新存储过程的问题。错误是:
UPDATE失败,因为以下SET选项的设置不正确:'QUOTED_IDENTIFIER'。验证SET选项是否正确,以便与计算列和/或查询通知和/或xml数据类型方法的索引视图和/或索引一起使用。
SQL状态:42000
原生错误:1934年
不幸的是,此表有无索引视图,计算列或查询通知。这个存储过程在过去几天运行正常,并且从今天起一直在返回此错误。
是否有任何建议有助于确定问题?
注意:如果我将quoted_identifier
设置为ON
并重新运行CREATE PROCEDURE
,则问题将得到修复(暂时)。但我想先了解是什么引发了这个问题。
答案 0 :(得分:46)
为了避免这个错误,我需要添加
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
用于编辑具有计算列的表的所有存储过程。
您无需在proc中添加SET
,只需在创建过程中使用它,如下所示:
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE dbo.proc_myproc
...
答案 1 :(得分:3)
我们无法通过设置引用的标识符来创建索引视图。我刚刚尝试过,如果关闭它,SQL 2005就会立即抛出错误:
无法创建索引。对象'SmartListVW'是在关闭以下SET选项的情况下创建的:'QUOTED_IDENTIFIER'。
正如gbn所说,重建索引必须是关闭它的唯一方式。
我看过很多文章说在创建视图索引之前必须打开它。否则,在插入,更新表时会出现错误,但在这里我可以立即得到错误,因此sql引擎将不允许通过将其设置为off来创建视图索引,按照msdn link。 / p>
我前一段时间在in stack问了一个类似的问题......
编辑
我关闭了全局查询(在编辑器中)ANSI设置并在新编辑器中运行了索引脚本,这次它也抛出相同的错误。所以我们很清楚,我们无法通过关闭quoted_identifier来创建视图索引。
答案 2 :(得分:2)
一些想法:
索引重建了吗?如果使用DMO进行索引维护,则不会始终保留quoted_identifier。它是一个追踪的油漆,是一个特殊的问题是SQL Server 2000直到SP4左右。
但是,我也在前一段时间见过SQL Server 2005.
答案 3 :(得分:2)
我迟到了这个派对,但有这个错误,想分享它。
我们的问题是经常性但随机的,所以我们知道它不是一个错误创建的对象。
我们最终将其跟踪到Citrix场中其中一台服务器上的ODBC连接。在该服务器上,有问题的ODBC已关闭(未选中)QUOTED_IDENTIFIERS。在所有其他服务器上,它按预期进行了检查。我们打开了选项,问题立即得到解决。
答案 4 :(得分:1)
当我尝试使用 sqlcmd
通过命令行运行 sql 文件时出现此错误:
sqlcmd -i myfile.sql
默认情况下,使用此命令行工具时 QUOTED_IDENTIFIER
设置为 OFF,您将得到相同的错误(无论在 SSMS 中它可能设置为 ON 并且相同的脚本将通过)。>
因此确实解决方案是将此 QUOTED_IDENTIFIER ON
添加到您的 sql 文件中,如建议的 Jim,或明确指定标志 -I
:
sqlcmd -i myfile.sql -I
答案 5 :(得分:0)
今天我在SSMS中运行存储过程时遇到此错误。断开与服务器的连接并重新连接新会话解决了我的问题。我以前运行的SP之前从未遇到过这个问题。
答案 6 :(得分:0)
在Job Scheduler SQL Server Agent
中运行此查询时遇到相同的错误
UPDATE [Order]
SET OrderStatusID = 100
WHERE OrderStatusID = 200
AND OrderID IN (
[...]
)
我解决了从[
中删除]
[Order]
个字符的问题:
UPDATE Order
SET OrderStatusID = 100
WHERE OrderStatusID = 200
AND OrderID IN (
[...]
)
没有更多错误
答案 7 :(得分:-1)
运行 SQL 代理作业时出现此错误,其中包含 3 个步骤 T-sql
脚本。
Msg 1934, Sev 16, State 1, Line 15 : UPDATE 失败,因为 以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'。 验证 SET 选项是否适用于索引视图和/或 计算列和/或过滤索引和/或查询上的索引 通知和/或 XML 数据类型方法和/或空间索引 操作。 [SQLSTATE 42000]
我添加了
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
到代理作业的顶部并解决了问题。