为啥quoted_identifier 必须打开才能使用过滤索引?

Posted

技术标签:

【中文标题】为啥quoted_identifier 必须打开才能使用过滤索引?【英文标题】:Why must quoted_identifier be ON to use a filtered index?为什么quoted_identifier 必须打开才能使用过滤索引? 【发布时间】:2017-12-16 02:28:57 【问题描述】:

这里有很多关于 SO 的问题和关于如何处理这种混乱的在线文章,但我的问题更为根本:为什么?带引号的标识符似乎是引擎如何解释查询的属性,与其中的数据无关。就索引和插入/更新查询而言,谁在乎呢?为什么这个设置很重要?

假设您允许插入/更新成功,并且在具有过滤索引的表中将quoted_identifier 设置为OFF - 究竟会破坏什么?

【问题讨论】:

【参考方案1】:

错误信息包含一个线索:

"Verify that SET options are correct for use with 
indexed views and/or 
indexes on computed columns and/or 
filtered indexes and/or 
query notifications and/or
XML data type methods and/or 
spatial index operations."

所有这些功能都需要一组规范的 SET 选项。可能是插入到具有过滤索引的表 QUOTED_IDENTIFIERS 可以工作,因为正如您所说,它只影响查询文本的解析。但是这些其他功能之一无法在 QUOTED_IDENTIFIERS 关闭的情况下使用。

QUOTED_IDENTIFERS 在查询解析中是如此奇怪的鸭子*(并且不建议将其关闭)这一事实可能与在这些场景中支持它根本不值得付出努力一样平凡。

*请参阅https://docs.microsoft.com/en-us/sql/t-sql/statements/set-quoted-identifier-transact-sql,其中解释了会话设置的差异、它在***临时批处理、存储过程和嵌套批处理中的行为。

【讨论】:

以上是关于为啥quoted_identifier 必须打开才能使用过滤索引?的主要内容,如果未能解决你的问题,请参考以下文章

创建/修改具有不同 QUOTED_IDENTIFIER 值的多个对象(在存储过程中)

全局实施 QUOTED_IDENTIFIER

过滤的唯一索引导致更新失败,因为不正确的 'QUOTED_IDENTIFIER' 设置

删除所有表时出错“删除失败,因为以下 SET 选项的设置不正确:'QUOTED_IDENTIFIER'”

执行并设置 Quoted_Identifier

在存储过程中设置 QUOTED_IDENTIFIER