早上来到公司,发现用于整理索引碎片的Job跑失败了,查看job history,发现以下错误消息:

ALTER INDEX failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. 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. [SQLSTATE 42000] (Error 1934).  The step failed.

从抛出的错误消息中,可以很容易分析出,产生错误的原因是没有 SET QUOTED_IDENTIFIER =ON。

微软Docs给出的解释是:

  • 当你在计算列(computed column)或索引视图(idnexed view)上创建(create)或修改(alter)索引时,必须设置SET QUOTED_IDENTIFIER =ON。
  • 当你创建过滤索引时,必须设置SET QUOTED_IDENTIFIER =ON。
  • 当调用XML数据类型方法时,必须设置SET QUOTED_IDENTIFIER =ON。

从上面的描述可以看出,QUOTED_IDENTIFIER选项设置为ON是非常重要的,事实上,该选项默认设置为ON。用户可以通过下面三种方式来查看SET选项的默认值:

DBCC USEROPTIONS

select db.name
,db.database_id
,db.is_quoted_identifier_on
from sys.databases db select *
from sys.dm_exec_sessions
where session_id=@@SPID

QUOTED_IDENTIFIER的作用

QUOTED_IDENTIFIER 选项的作用是强迫SQL Server遵循ISO的规则,把双引号和中括号作为标识符的界定符,用单引号来表示字符串。默认情况下,SQL Server的QUOTED_IDENTIFIER 选项的配置值是ON,这就意味着,界定符是中括号 [] 或 双引号。标识符是指变量、表、存储过程、函数等数据库对象的名称。

当SET QUOTED_IDENTIFIER选项设置为ON时,标识符可以被双引号和中括号界定,字符串必须使用单引号界定,举个例子,"var 1" 是一个标识符,等价于[var 1],字符串智能使用单引号,'str 1',也就是说,使用双引号的字符串被解释为一个object的标识符。

当SET QUOTED_IDENTIFIER选项设置为OFF时,标识符的界定必须遵守TSQL规则,字符串使用单引号或双引号,标识符只能使用中括号。

1,界定符影响标识符

当 SET QUOTED_IDENTIFIER=ON时,SQL Server将双引号作为界定符,功能和默认定界符 中括号 [] 相同,而中括号作为定界符是不受Quoted_Identifier 选项设置的影响,始终可以作为定界符使用。

举个例子,select是关键字,不能用于用户定义的object,除非使用定界符。当SET QUOTED_IDENTIFIER ON 时,可以使用双引号“select”,这样select关键字就能作为Table Name,作用和[select]相同。

SET QUOTED_IDENTIFIER OFF
GO
--fail
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO SET QUOTED_IDENTIFIER ON;
GO -- succeed
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO SELECT "identity","order"
FROM "select"
ORDER BY "order";
GO DROP TABLE "SELECT";
GO

2,字符串表示

当 SET QUOTED_IDENTIFIER=ON时,字符串必须使用单引号;当SET QUOTED_IDENTIFIER=OFF时,字符串可以使用使用单引号,也可以使用双引号

SET QUOTED_IDENTIFIER ON;
GO
--succed
select 'abc'
go --fail
select "abc"
GO SET QUOTED_IDENTIFIER OFF;
GO
--succed
select 'abc'
go --succed
select "abc"
GO

报错信息:Invalid column name 'abc',很奇怪的错误信息。当设置QUOTED_IDENTIFIER为ON时,双引号标识的字符串会被解释为一个 Object 的标识符。

SET QUOTED_IDENTIFIER选项的使用

1,修改SET QUOTED_IDENTIFIER选项,在当前session中设置 SET QUOTED_IDENTIFIER 语句只会影响当前的Session,并且是在Parse 时设置的。

2,SET QUOTED_IDENTIFIER和 SET ARITHABORT 搭配使用

在使用SQL Server Agent删除数据的时候,SQL Server有时会抛出错误消息:

DELETE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. 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. [SQLSTATE 42000] (Error 1934).  The step failed.

解决方案是:在 delete 语句之前把以下两个set option设置为ON

SET ARITHABORT ON
SET QUOTED_IDENTIFIER ON

通常这两个选项的默认值是ON,当出现错误时,应该知道在创建或修改Index时,需要在语句执行前设置:SET QUOTED_IDENTIFIER ON 和 SET ARITHABORT ON。

参考文档:

SET QUOTED_IDENTIFIER (Transact-SQL)

SET QUOTED_IDENTIFIER选项对索引的影响的更多相关文章

  1. QUOTED_IDENTIFIER 选项对 index 的影响

    在修改或创建Index时,有时会收到一些Error Message,指明Set options设置错误,最常见的选项是:SET QUOTED_IDENTIFIER 选项 当创建或修改的index包含c ...

  2. Atitit.分区对索引的影响 分区索引和全局索引 attilax总结

    Atitit.分区对索引的影响 分区索引和全局索引 attilax总结 1. 分区的好处1 2. 分区键:2 3. 分区的建议:2 4. 分区索引和全局索引:2 5. 全局索引就是在全表上创建索引, ...

  3. MySQL 中like的使用对于索引的影响

    今天看了一篇对于like使用对索引的影响的文章,发现自己实践的跟文章得出结论不大一样.所以还是建议自己再看别人文章的时候自己亲自动手实践一下.以免学到不全面的知识. 列子: 先建立一张表: -- 创建 ...

  4. SQL Server-聚焦聚集索引对非聚集索引的影响(四)

    前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没有任 ...

  5. 【Oracle】-【COMMIT对索引的影响】-从trace看COMMIT对索引的影响

    之前看过老杨http://yangtingkun.itpub.net/post/468/231000的一篇文章,讲述了INSERT操作对全文索引无操作,但DELETE时为了防止删除的数据仍能通过索引的 ...

  6. SQL Server-聚焦聚集索引对非聚集索引的影响

      前言 在学习SQL 2012基础教程过程中会时不时穿插其他内容来进行讲解,相信看过SQL Server 2012 T-SQL基础教程的童鞋知道前面写的所有内容并非都是摘抄书上内容,如若是这样那将没 ...

  7. Sql Server之旅——第十站 看看DML操作对索引的影响

    我们都知道建索引是需要谨慎的,当只有利大于弊的时候才适合建,我们也知道建索引是需要维护成本的,这个维护也就在于DML操作了, 下面我们具体看看到底DML对索引都有哪些内幕.... 一:delete操作 ...

  8. DML操作对索引的影响

    一:delete操作 现在我们已经知道,索引都是以B树的形式存在的,既然是B树,我们就要看看他们的叶子节点和分支结点,先准备点测试数据,如下图: 按 Ctrl+C 复制代码 按 Ctrl+C 复制代码 ...

  9. order by多个字段对索引的影响

    某前台sql语句,简化后如下SELECT products_name,products_viewed FROM `products_description` ORDER BY products_vie ...

随机推荐

  1. Android 中发送邮件

    第一步.导入第三方jar包 Android实现发送邮件,首先需要依赖additional.jar.mail.jar和activation.jar这3个jar包. Google提供了下载地址:https ...

  2. MSSQL记录表字段数据变化的相关SQl

    在软件实施过程中,也许会有这样的问题: 表中数据出现非预期的结果,此时不确定是程序问题,哪个程序,存储过程,触发器.. 或还是人为修改的结果,此时可以用触发器对特定的表字段做跟踪监视,记录每次新增,修 ...

  3. MySQL事务优化

    ====================事务特性 事务隔离级别 事务控制语句 MySQL优化==================== 事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要么全 ...

  4. Jmeter(四十四)启动提示 Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5.

    有已知的已知:有些事情我们自己知道自己知道: 我们也知道有已知的未知:这是指我们知道有些事情自己不知道: 但是还有未知的未知:有些事情我们不知道自己不知道:   ---美国国防部长 唐纳德·拉姆斯菲尔 ...

  5. 【GPU加速系列】PyCUDA(一):上手简单操作

    PyCUDA 可以通过 Python 访问 NVIDIA 的 CUDA 并行计算 API. 具体介绍和安装可以参考 PyCUDA 官网文档和 pycuda PyPI. 本文涵盖的内容有: 通过 PyC ...

  6. NLP中的预训练语言模型(一)—— ERNIE们和BERT-wwm

    随着bert在NLP各种任务上取得骄人的战绩,预训练模型在这不到一年的时间内得到了很大的发展,本系列的文章主要是简单回顾下在bert之后有哪些比较有名的预训练模型,这一期先介绍几个国内开源的预训练模型 ...

  7. Magic Master(2019年南昌网络赛E题+约瑟夫环)

    目录 题目链接 题意 思路 代码 题目链接 传送门 题意 初始时你有\(n\)张牌(按顺序摆放),每一次操作你将顶端的牌拿出,然后按顺序将上面的\(m\)张牌放到底部. 思路 首先我们发下拿走\(1\ ...

  8. 搜索 - 广度优先搜索(BFS)普通模板

    bfs广度优先搜索模板 本人蒟蒻,为响应号召 写下bfs模板一篇 可以适用于求最短步数,等最优解问题.如有不足或者不对的地方请各位大佬及时指出 ^-^ 欢迎来戳 具体实现代码(C++) 各个模块功能和 ...

  9. oneinstack——证书更新

    如果你安装好 oneinstack 你的定时任务就会自动添加 "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh ...

  10. html--前端css常用属性

    1.颜色属性 <div style="color:blueviolet">ppppp</div> 输入颜色英文单词 <div style=" ...