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