在两个表上创建三个过滤索引,过滤由条件设置[column] <> ''。我启动了一项工作,其中执行了几十个过程和函数,这些过程和函数与上述表格紧密配合以进行读写。作业因错误而崩溃:
更新失败。以下 SET 选项包含无效值:“QUOTED_IDENTIFIER”
QUOTED_IDENTIFIER的 文档有以下说明:
创建过滤索引时,SET QUOTED_IDENTIFIER 必须设置为 ON。
正是这样做的。
在某些过程中,QUOTED_IDENTIFIER参数设置为OFF,这可能是问题所在吗?过滤后的索引与QUOTED_IDENTIFIER参数的值有何关系?
是的,在这个。该参数不仅在创建过滤索引时
QUOTED_IDENTIFIER必须设置ON,而且在打算访问索引时也必须设置(请参阅CREATE INDEX,Filtered Indexes部分;另请注意其他必需参数SET)。在过程中,指令的上下文在执行时部分取决于创建过程时设置的参数(特别是 的值
QUOTED_IDENTIFIER)。因此,例如,如果有一个带有索引的表
并假设程序
然后在执行
P_Select时,如果它是用创建的,则可以使用QUOTED_IDENTIFIER ON索引。IX_table_column如果它P_Select是用创建的QUOTED_IDENTIFIER OFF,那么索引将被忽略,即使其他因素有利于它的使用。如果在程序中不是
SELECT,但是UPDATE:然后默默地忽略索引将不再起作用(因为数据更改也必须反映在索引中)。在这种情况下,会产生一个错误
Msg 1934。该参数的值
QUOTED_IDENTIFIER必须保持一致,并且在ON创建过滤索引时和使用时必须相同。文档中没有解释为什么会这样。我假设这样做可能是为了明确解释索引过滤器和查询中的谓词。对于
ONandOFF,双引号的解释不同。在以下示例中可以看出这如何影响请求。让我们创建一个表:
让我们使用不同的设置运行相同的查询
QUOTED_IDENTIFIER:查询
ON将返回一行,因为"A" = 'A'相当于[A] = 'A'。查询OFF- 所有行,因为 在这种情况下"A" = 'A'相当于'A' = 'A'.如果作为索引中具有不同值或具有不同值
WHERE "A" = 'A'的过滤器将具有与创建索引时预期不同的含义,那将不是一件好事。UPDATESELECTQUOTED_IDENTIFIER