在存储过程中设置 QUOTED_IDENTIFIER

Posted

技术标签:

【中文标题】在存储过程中设置 QUOTED_IDENTIFIER【英文标题】:SET QUOTED_IDENTIFIER in stored procedure 【发布时间】:2016-08-10 18:42:38 【问题描述】:

当我的生产数据库恢复到开发环境时,我遇到了问题。在那个数据库中,我有一个设置SET QUOTED_IDENTIFIER OFF 的存储过程。我不确定为什么要这样做(我没有写)。执行在生产中运行良好,但是,当我在 dev 中运行时出现以下错误:

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

如果我将其设置为on,则存储过程在 dev 中运行良好。我确实找到了一些有关重建索引的信息,这些信息可能会导致此问题。我在桌子上尝试了rebuild all,但它并没有改变问题。有什么想法吗?

prod 还有SET ANSI_NULLS ONSET NOCOUNT ON

【问题讨论】:

你按照消息说的做了吗?验证 SET options are correct 是否与索引视图和/或计算列上的索引和/或过滤索引和/或查询通知和/或 XML 数据类型方法和/或空间索引操作一起使用? 我会检查与生产相比的数据库设置,以确保在数据库属性 -> 选项 -> 其他 -> 启用引用标识符中匹配。 它们都设置为 false 这不仅仅是数据库范围的设置。执行某些操作时它是否打开很重要。例如。正如文档告诉您的那样,当您在计算列上创建索引时,它必须是 on。在生产和开发中执行相应操作时,此设置是否具有相同的值? 我们找到了导致问题的索引。它有一个过滤器,状态 = 'A'。如果我们删除过滤器,问题就会消失。它没有使用双引号。 【参考方案1】:

quoted_identifier 的使用

1。 SET QUOTED_IDENTIFIERON,则双引号内的字符被视为标识符。所以下面的命令会成功。

    SET QUOTED_IDENTIFIER ON 
    GO
    CREATE TABLE dbo.”Table”
    (id int,”Function” VARCHAR(20)) 
    GO

如果我们保留SET QUOTED_IDENTIFIER OFF,那么上面的语句就会失败。

在生产环境中使用quoted_identifier 创建的对象

2。您可以通过以下查询找到使用您的生产环境创建的对象,其中设置了标识符ON

SET QUTOED_IDENTIFIERS 设置为ON:

    SELECT OBJECT_NAME _
    (object_id) _
    FROM sys.sql_modules _
    WHERE uses_quoted_identifier = 1

因此,如果您将quoted_identifier 状态保持关闭,则您的对象不会在开发环境中创建

【讨论】:

以上是关于在存储过程中设置 QUOTED_IDENTIFIER的主要内容,如果未能解决你的问题,请参考以下文章

如何在存储过程 MySql 中设置默认时区

在存储过程中设置 RAISERROR 的编号和消息

MYSQL,使用单个选择语句在存储过程中设置两个变量

在存储过程中设置 QUOTED_IDENTIFIER

我可以在存储过程中设置默认架构吗?

如何在 GitHub 和 Jenkins 中设置 DB2 存储过程