提问人:balalakshmi 提问时间:8/7/2009 最后编辑:Ian Boydbalalakshmi 更新时间:1/12/2023 访问量:114961
UPDATE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”
UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'
问:
我的更新存储过程有问题。错误是:
UPDATE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是否正确用于索引视图和/或计算列和/或查询通知和/或 xml 数据类型方法的索引。
SQL 状态:42000
本机错误:1934
遗憾的是,此表没有索引视图、计算列或查询通知。此存储过程在过去几天运行良好,从今天开始一直返回此错误。
是否有任何建议有助于确定问题?
注意:如果我将 设置为并重新运行 ,问题将得到解决(目前)。但我想首先了解是什么触发了这个问题。quoted_identifier
ON
CREATE PROCEDURE
答:
一些想法:
索引是否已重建?如果使用 DMO 进行索引维护,则不会始终保留quoted_identifier。追踪起来可能很痛苦,一个特殊的问题是 SQL Server 2000 直到 SP4 左右。
但是,我前段时间也在 SQL Server 2005 上看到过。
我们无法通过关闭带引号的标识符来创建索引视图。我刚刚尝试过,如果关闭 SQL 2005,它会立即抛出错误:
无法创建索引。对象“SmartListVW”是在关闭以下 SET 选项的情况下创建的:“QUOTED_IDENTIFIER”。
正如 gbn 所说,重建索引必须是关闭索引的唯一其他方式。
我看到很多文章说在创建视图索引之前必须打开它。否则,在插入、更新表时会出现错误,但在这里我可以立即收到错误,因此 sql 引擎不允许通过将其设置为关闭来在视图上创建索引,根据此 msdn 链接。
我前段时间在堆栈中问过一个类似的问题......
编辑
我关闭了全局查询执行(在编辑器中)ANSI 设置并在新编辑器中运行索引脚本,这次它也抛出了相同的错误。因此,很明显,我们无法通过关闭 quoted_identifier 来创建视图索引。
为了避免这个错误,我需要添加
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
对于我所有存储的过程,编辑带有计算列的表。
你不需要在 proc 内部添加,只需在创建过程中使用它,如下所示:SET
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO
CREATE PROCEDURE dbo.proc_myproc
...
评论
我来晚了,但有这个错误,想分享一下。
我们的问题是反复出现的,但随机的,所以我们知道它不是一个错误创建的对象。
我们最终将其追踪到我们 Citrix 场中一台服务器上的 ODBC 连接。在该服务器上,有问题的 ODBC 已关闭其QUOTED_IDENTIFIERS(未选中)。在所有其他服务器上,它按预期进行了检查。我们打开了该选项,问题立即得到了解决。
我今天在SSMS中运行存储过程时收到此错误。断开与服务器的连接并重新连接新会话为我解决了问题。我运行的 SP 以前从未遇到过这个问题。
我在作业计划程序中运行此查询时遇到了同样的错误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 (
[...]
)
不再有错误
当我运行SQL代理作业时,我遇到了这个错误,它有3个步骤的脚本。T-sql
消息 1934,Sev 16,状态 1,第 15 行:UPDATE 失败,因为 以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。 验证 SET 选项是否正确用于索引视图和/或 计算列和/或筛选索引和/或查询的索引 通知和/或XML数据类型方法和/或空间索引 操作。[SQLSTATE 42000]
我添加了
SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
到代理作业的顶部,这解决了问题。
当我尝试通过命令行运行sql文件时,我遇到了这个错误:sqlcmd
sqlcmd -i myfile.sql
默认情况下,使用此命令行工具时设置为 OFF,并且你将收到相同的错误(无论在 SSMS 中它可能设置为 ON,并且相同的脚本将通过)。QUOTED_IDENTIFIER
因此,实际上解决方案是按照 Jim 的建议将其添加到您的 sql 文件中,或者显式指定标志:QUOTED_IDENTIFIER ON
-I
sqlcmd -i myfile.sql -I
SELECT
OBJECT_NAME (sm.object_id) AS [Name],
sm.uses_ansi_nulls,
sm.uses_quoted_identifier,
N'SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
--change the below CREATE to an ALTER.
GO
' + sm.definition AS PossibleFixingStatement
FROM
sys.sql_modules AS sm
WHERE
1 = 1
AND
(
sm.uses_ansi_nulls <> 1
OR sm.uses_quoted_identifier <> 1
)
AND NOT EXISTS
(
SELECT
*
FROM
sys.objects AS o
WHERE
o.is_ms_shipped = 1
AND o.object_id = sm.[object_id]
)
ORDER BY
sm.uses_ansi_nulls,
sm.uses_quoted_identifier;
用于识别受影响对象的查询。这里提到的sp_blitz程序的一部分 https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/1698
我遇到了同样的错误,必须添加一些设置才能解决它:
SET ANSI_NULLS ON;
SET ANSI_PADDING ON;
SET ANSI_WARNINGS ON;
SET ARITHABORT ON;
SET CONCAT_NULL_YIELDS_NULL ON;
SET NUMERIC_ROUNDABORT OFF;
SET QUOTED_IDENTIFIER OFF;
SET NOCOUNT ON;
评论