【问题标题】:UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'UPDATE 失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'
【发布时间】:2009-08-07 10:12:17
【问题描述】:

我遇到了更新存储过程的问题。错误是:

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

SQL 状态:42000
本机错误:1934

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

有什么建议可以帮助确定问题吗?

注意:如果我将quoted_identifier 设置为ON 并重新运行CREATE PROCEDURE,问题将得到解决(暂时)。但我想首先了解是什么引发了这个问题。

【问题讨论】:

  • 您能具体说明一下哪个设置吗?

标签: sql-server-2005


【解决方案1】:

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

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;

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

你不需要在proc中添加SETinside,只需在创建过程中使用它,像这样:

SET ANSI_NULLS, QUOTED_IDENTIFIER ON;
GO

CREATE PROCEDURE dbo.proc_myproc
...

【讨论】:

  • 不仅在计算列的情况下有效。今天我突然在一个存储过程中遇到了这个问题,它用一个 XML 列更新了一个表,它曾经运行得很好。我试图在 proc 中设置 ANSI NULL 标志,但它不起作用。您的解决方案挽救了这一天。
【解决方案2】:

我们不能通过关闭带引号的标识符来创建索引视图。我刚刚试了一下,如果关闭,SQL 2005 会立即抛出错误:

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

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

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

我曾经在这里in stack问过类似的问题...

编辑

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

【讨论】:

    【解决方案3】:

    当我尝试通过命令行使用sqlcmd 运行sql 文件时出现此错误:

    sqlcmd -i myfile.sql

    默认QUOTED_IDENTIFIER在使用这个命令行工具时被设置为OFF,你会得到同样的错误(不管在SSMS中它可能被设置为ON并且同样的脚本会通过)。

    因此,确实解决方案是将 QUOTED_IDENTIFIER ON 添加到您的 sql 文件中,如建议的 Jim,或明确指定标志 -I

    sqlcmd -i myfile.sql -I

    【讨论】:

      【解决方案4】:

      我参加这个聚会迟到了,但遇到了这个错误并想分享它。

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

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

      【讨论】:

        【解决方案5】:

        一些想法:

        是否重建了索引?如果您使用 DMO 进行索引维护,则不会始终保留quoted_identifier。追查可能会很痛苦,并且在 SQL Server 2000 SP4 之前是一个特殊的问题。

        不过,我前段时间在 SQL Server 2005 上也见过。

        【讨论】:

          【解决方案6】:

          我在运行 SQL 代理作业时遇到此错误,该作业有 3 个步骤 T-sql 脚本。

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

          我加了

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

          【讨论】:

            【解决方案7】:
            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;
            

            查询以识别受影响的对象。 https://github.com/BrentOzarULTD/SQL-Server-First-Responder-Kit/issues/1698 此处提到的 sp_blitz 过程的一部分

            【讨论】:

              【解决方案8】:

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

              【讨论】:

                【解决方案9】:

                我在 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 (    
                        [...]
                )
                

                没有更多错误

                【讨论】:

                  猜你喜欢
                  • 2014-05-20
                  • 2017-03-22
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2012-01-13
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多