UPDATE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”

UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'

提问人:balalakshmi 提问时间:8/7/2009 最后编辑:Ian Boydbalalakshmi 更新时间:1/12/2023 访问量:114961

问:

我的更新存储过程有问题。错误是:

UPDATE 失败,因为以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。验证 SET 选项是否正确用于索引视图和/或计算列和/或查询通知和/或 xml 数据类型方法的索引。

SQL 状态:42000
本机错误:1934

遗憾的是,此表没有索引视图、计算列或查询通知。此存储过程在过去几天运行良好,从今天开始一直返回此错误。

是否有任何建议有助于确定问题?

注意:如果我将 设置为并重新运行 ,问题将得到解决(目前)。但我想首先了解是什么触发了这个问题。quoted_identifierONCREATE PROCEDURE

sql-server-2005

评论

0赞 balalakshmi 8/7/2009
您能具体说明哪种设置吗?

答:

2赞 gbn 8/7/2009 #1

一些想法:

索引是否已重建?如果使用 DMO 进行索引维护,则不会始终保留quoted_identifier。追踪起来可能很痛苦,一个特殊的问题是 SQL Server 2000 直到 SP4 左右。

但是,我前段时间也在 SQL Server 2005 上看到过。

6赞 RameshVel 8/7/2009 #2

我们无法通过关闭带引号的标识符来创建索引视图。我刚刚尝试过,如果关闭 SQL 2005,它会立即抛出错误:

无法创建索引。对象“SmartListVW”是在关闭以下 SET 选项的情况下创建的:“QUOTED_IDENTIFIER”。

正如 gbn 所说,重建索引必须是关闭索引的唯一其他方式。

我看到很多文章说在创建视图索引之前必须打开它。否则,在插入、更新表时会出现错误,但在这里我可以立即收到错误,因此 sql 引擎不允许通过将其设置为关闭来在视图上创建索引,根据此 msdn 链接

我前段时间在堆栈中问过一个类似的问题......

编辑

我关闭了全局查询执行(在编辑器中)ANSI 设置并在新编辑器中运行索引脚本,这次它也抛出了相同的错误。因此,很明显,我们无法通过关闭 quoted_identifier 来创建视图索引。

98赞 Jim 5/10/2012 #3

为了避免这个错误,我需要添加

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;

对于我所有存储的过程,编辑带有计算列的表。

你不需要在 proc 内部添加,只需在创建过程中使用它,如下所示:SET

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO

CREATE PROCEDURE dbo.proc_myproc
...

评论

1赞 davidthegrey 5/4/2020
不仅在计算的 comlumn 情况下有效。今天,我突然在存储过程中遇到了这个问题,该存储过程更新了带有XML列的表,该表过去运行良好。我试图在proc中设置ANSI NULL标志,但它不起作用。您的解决方案挽救了这一天。
4赞 PseudoToad 2/11/2014 #4

我来晚了,但有这个错误,想分享一下。

我们的问题是反复出现的,但随机的,所以我们知道它不是一个错误创建的对象。

我们最终将其追踪到我们 Citrix 场中一台服务器上的 ODBC 连接。在该服务器上,有问题的 ODBC 已关闭其QUOTED_IDENTIFIERS(未选中)。在所有其他服务器上,它按预期进行了检查。我们打开了该选项,问题立即得到了解决。

0赞 Tjaart 8/18/2016 #5

我今天在SSMS中运行存储过程时收到此错误。断开与服务器的连接并重新连接新会话为我解决了问题。我运行的 SP 以前从未遇到过这个问题。

0赞 Vland 12/11/2019 #6

我在作业计划程序中运行此查询时遇到了同样的错误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 (    
        [...]
)

不再有错误

3赞 Mulumebet Asfaw 4/2/2021 #7

当我运行SQL代理作业时,我遇到了这个错误,它有3个步骤的脚本。T-sql

消息 1934,Sev 16,状态 1,第 15 行:UPDATE 失败,因为 以下 SET 选项的设置不正确:“QUOTED_IDENTIFIER”。 验证 SET 选项是否正确用于索引视图和/或 计算列和/或筛选索引和/或查询的索引 通知和/或XML数据类型方法和/或空间索引 操作。[SQLSTATE 42000]

我添加了

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;到代理作业的顶部,这解决了问题。

7赞 antanta 6/21/2021 #8

当我尝试通过命令行运行sql文件时,我遇到了这个错误:sqlcmd

sqlcmd -i myfile.sql

默认情况下,使用此命令行工具时设置为 OFF,并且你将收到相同的错误(无论在 SSMS 中它可能设置为 ON,并且相同的脚本将通过)。QUOTED_IDENTIFIER

因此,实际上解决方案是按照 Jim 的建议将其添加到您的 sql 文件中,或者显式指定标志:QUOTED_IDENTIFIER ON-I

sqlcmd -i myfile.sql -I

3赞 N.Y 11/3/2021 #9
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

0赞 Ashvini Mukundarao 6/30/2022 #10

我遇到了同样的错误,必须添加一些设置才能解决它:

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;