早上来到公司,发现用于整理索引碎片的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)

QUOTED_IDENTIFIER 选项对 index 的影响的更多相关文章

  1. SET QUOTED_IDENTIFIER选项对索引的影响

    早上来到公司,发现用于整理索引碎片的Job跑失败了,查看job history,发现以下错误消息: ALTER INDEX failed because the following SET optio ...

  2. oracle11.2中分区功能测试之add&split partition对global&local index的影响

    生产库中某些大表的分区异常,需要对现有表进行在线操作,以添加丢失分区,因为是生产库,还是谨慎点好,今天有空,针对add&split分区对global&local索引的影响进行了测试,测 ...

  3. Lucene——Field.Store(存储域选项)及Field.Index(索引选项)

    Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...

  4. sqlserver中常用的四个选项(NOCOUNT/ANSI_NULLS/QUOTED_IDENTIFIER/ XACT_ABORT)

    1 NOCOUNT选项 当 SET NOCOUNT 为 ON 时,不返回计数.当 SET NOCOUNT 为 OFF 时,返回计数. eg: if object_id(N'table_test',N' ...

  5. Tempdb对SQL Server性能的影响

    转载文章,原文地址:http://www.cnblogs.com/laodao1/archive/2010/04/15/1712395.html1.SQL Server系统数据库介绍 SQL Serv ...

  6. 执行计划中常见index访问方式(转)

    近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本 ...

  7. vsftp的设置选项

    设置匿名用户上传的文件的权限: anon_umask=  匿名用户新增文件的umask 数值.默认值为077.     VSFTPD的设置选项 VSFTPD的配置文件/etc/vsftpd/vsftp ...

  8. git commit的--amend选项

    git commit --amend常常用来修改某个branch上最顶端的commit,大多数情况下,这个命令给人的感觉是用新的commit替换了原来的commit.git commit --amen ...

  9. 获取列表菜单的选项值与选项以后的VALUE

    <html> <body> <select id="izan" name="" onchange='izzzz()'> &l ...

随机推荐

  1. 图的基本遍历算法的实现(BFS & DFS)复习

    #include <stdio.h> #define INF 32767 typedef struct MGraph{ ]; ][]; int ver_num, edge_num; }MG ...

  2. 【转】iOS学习之适配iOS10

    适配iOS10 2016年9月7日,苹果发布iOS 10.2016年9月14日,全新的操作系统iOS 10将正式上线. 作为开发者,如何适配iOS10呢? 1.Notification(通知) 自从N ...

  3. IIS最大连接数优化

    错误信息:Error Summary:HTTP Error 503.2 - Service UnavailableThe serverRuntime@appConcurrentRequestLimit ...

  4. ACM: Gym 101047B Renzo and the palindromic decoration - 手速题

     Gym 101047B  Renzo and the palindromic decoration Time Limit:2000MS     Memory Limit:65536KB     64 ...

  5. [NOIP2013]华容道

    1.题面 小 B 最近迷上了华容道,可是他总是要花很长的时间才能完成一次.于是,他想到用编程来完成华容道:给定一种局面,华容道是否根本就无法完成,如果能完成,最少需要多少时间.小 B 玩的华容道与经典 ...

  6. 关于node.js

    JS是一种脚本语言,它的本身并不能进行编译和执行,在最早的时期只是作为浏览器的脚本,只能够在浏览器中执行操作,也就是说JS必须依赖一个运行环境作为载体才能够执行. 而nodejs是基于chromeV8 ...

  7. 1002. A+B for Polynomials (25)

    题目链接:https://www.patest.cn/contests/pat-a-practise/1002 原题如下: This time, you are supposed to find A+ ...

  8. STL之关联容器

    关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...

  9. JeeSite学习笔记~代码生成原理

    1.建立数据模型[单表,一对多表,树状结构表] 用ERMaster建立数据模型,并设定对应表,建立关联关系 2.系统获取对应表原理 1.怎样获取数据库的表 genTableForm.jsp: < ...

  10. daima

    # -*- coding: utf-8 -*- import theano import theano.tensor as T import numpy as np from sklearn impo ...