RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 566432
Accepted
Anatol
Anatol
Asked:2020-09-15 11:23:26 +0000 UTC2020-09-15 11:23:26 +0000 UTC 2020-09-15 11:23:26 +0000 UTC

在 SQL Server 中使用过滤索引的注意事项

  • 772

在两个表上创建三个过滤索引,过滤由条件设置[column] <> ''。我启动了一项工作,其中执行了几十个过程和函数,这些过程和函数与上述表格紧密配合以进行读写。作业因错误而崩溃:

更新失败。以下 SET 选项包含无效值:“QUOTED_IDENTIFIER”

QUOTED_IDENTIFIER的 文档有以下说明:

创建过滤索引时,SET QUOTED_IDENTIFIER 必须设置为 ON。

正是这样做的。

在某些过程中,QUOTED_IDENTIFIER参数设置为OFF,这可能是问题所在吗?过滤后的索引与QUOTED_IDENTIFIER参数的值有何关系?

sql-server
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    i-one
    2020-09-15T20:26:40Z2020-09-15T20:26:40Z

    在某些程序中,QUOTED_IDENTIFIER 参数设置为 OFF,这可能是问题所在吗?

    是的,在这个。该参数不仅在创建过滤索引时QUOTED_IDENTIFIER必须设置ON,而且在打算访问索引时也必须设置(请参阅CREATE INDEX,Filtered Indexes部分;另请注意其他必需参数SET)。

    在过程中,指令的上下文在执行时部分取决于创建过程时设置的参数(特别是 的值QUOTED_IDENTIFIER)。

    因此,例如,如果有一个带有索引的表

    CREATE INDEX IX_table_column ON [table]([column]) WHERE [column] <> '';
    

    并假设程序

    SET QUOTED_IDENTIFIER ON /*OFF*/;
    GO
    
    CREATE PROCEDURE P_Select
    AS
         SELECT [column]
         FROM [table]
         WHERE [column] <> '';
    GO
    

    然后在执行P_Select时,如果它是用创建的,则可以使用QUOTED_IDENTIFIER ON索引。IX_table_column如果它P_Select是用创建的QUOTED_IDENTIFIER OFF,那么索引将被忽略,即使其他因素有利于它的使用。

    如果在程序中不是SELECT,但是UPDATE:

    SET QUOTED_IDENTIFIER OFF;
    GO
    
    CREATE PROCEDURE P_Update
    AS
         UPDATE [table]
           SET
               [column] = 'Updated';
    GO
    

    然后默默地忽略索引将不再起作用(因为数据更改也必须反映在索引中)。在这种情况下,会产生一个错误Msg 1934。


    过滤后的索引与 QUOTED_IDENTIFIER 参数的值有何关系?

    该参数的值QUOTED_IDENTIFIER必须保持一致,并且在ON创建过滤索引时和使用时必须相同。文档中没有解释为什么会这样。我假设这样做可能是为了明确解释索引过滤器和查询中的谓词。

    对于ONand OFF,双引号的解释不同。在以下示例中可以看出这如何影响请求。

    让我们创建一个表:

    CREATE TABLE quot_ident(A CHAR(1));
    
    INSERT INTO quot_ident
    VALUES('A'), ('B');
    

    让我们使用不同的设置运行相同的查询QUOTED_IDENTIFIER:

    SET QUOTED_IDENTIFIER ON;
    
    SELECT *
    FROM quot_ident
    WHERE "A" = 'A';
    
    SET QUOTED_IDENTIFIER OFF;
    
    SELECT *
    FROM quot_ident
    WHERE "A" = 'A';
    

    查询ON将返回一行,因为 "A" = 'A'相当于[A] = 'A'。查询OFF- 所有行,因为 在这种情况下"A" = 'A'相当于'A' = 'A'.

    如果作为索引中具有不同值或具有不同值WHERE "A" = 'A'的过滤器将具有与创建索引时预期不同的含义,那将不是一件好事。UPDATESELECTQUOTED_IDENTIFIER

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5