QUOTED_IDENTIFIER 选项对 index 的影响
早上来到公司,发现用于整理索引碎片的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 的影响的更多相关文章
- SET QUOTED_IDENTIFIER选项对索引的影响
早上来到公司,发现用于整理索引碎片的Job跑失败了,查看job history,发现以下错误消息: ALTER INDEX failed because the following SET optio ...
- oracle11.2中分区功能测试之add&split partition对global&local index的影响
生产库中某些大表的分区异常,需要对现有表进行在线操作,以添加丢失分区,因为是生产库,还是谨慎点好,今天有空,针对add&split分区对global&local索引的影响进行了测试,测 ...
- Lucene——Field.Store(存储域选项)及Field.Index(索引选项)
Field.Store.YES或者NO(存储域选项) 设置为YES表示或把这个域中的内容完全存储到文件中,方便进行文本的还原 设置为NO表示把这个域的内容不存储到文件中,但是可以被索引,此时内容无法完 ...
- sqlserver中常用的四个选项(NOCOUNT/ANSI_NULLS/QUOTED_IDENTIFIER/ XACT_ABORT)
1 NOCOUNT选项 当 SET NOCOUNT 为 ON 时,不返回计数.当 SET NOCOUNT 为 OFF 时,返回计数. eg: if object_id(N'table_test',N' ...
- Tempdb对SQL Server性能的影响
转载文章,原文地址:http://www.cnblogs.com/laodao1/archive/2010/04/15/1712395.html1.SQL Server系统数据库介绍 SQL Serv ...
- 执行计划中常见index访问方式(转)
近期有朋友对于单个表上的index各种情况比较模糊,这里对于单个表上,单个index出现的大多数情况进行了总结性测试,给出了测试结果,至于为什么出现这样的试验结果未做过多解释,给读者留下思考的空间.本 ...
- vsftp的设置选项
设置匿名用户上传的文件的权限: anon_umask= 匿名用户新增文件的umask 数值.默认值为077. VSFTPD的设置选项 VSFTPD的配置文件/etc/vsftpd/vsftp ...
- git commit的--amend选项
git commit --amend常常用来修改某个branch上最顶端的commit,大多数情况下,这个命令给人的感觉是用新的commit替换了原来的commit.git commit --amen ...
- 获取列表菜单的选项值与选项以后的VALUE
<html> <body> <select id="izan" name="" onchange='izzzz()'> &l ...
随机推荐
- 16-1-26---图解HTTP(01)
图解HTTP1.4.2确保可靠性的HTTP协议 按层次分,TCP位于传输层,提供可靠的字节流服务 所谓字节流服务,指为了方便传输,将大块数据分割成以报文为单位的数据包进行管理,而可靠的传输 ...
- iis下搭建通过phpstudy集成的环境,phpmyadmin导入数据库无法应解决办法
本人非常喜欢phpstudy的集成php+mysql环境,一键搞定,但是不知道为什么搭建的phpmyadmin的数据库管理器,无法上传,点击无反应 发现上传数据的界面有点不同 正常情况下是这样的: 非 ...
- cassandra写数据CommitLog
cassandra 两种方式: Cassandra-ArchitectureCommitLog Cassandra持久化-Durability 一种是配置commitlog_sync为periodic ...
- [Noip2016]蚯蚓 D2 T2 队列
[Noip2016]蚯蚓 D2 T2 Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯 ...
- 网站常用UI整理
1.UI插件包使用 Bootstrap 地址:http://v3.bootcss.com/getting-started/ Bootstrap buttons 按钮 地址:http://w ...
- hdfs 复制路径下所有文件
hadoop fs -cp $SRC_FILE $TARGET_FILE hadoop fs -cp $SRC_DIR $TARGET_DIR 注:复制路径时,最后一个斜杠是没有的.添加斜杠后报文件找 ...
- Unity自动寻路Navmesh之高级
隔离层自动生成寻路网格 (源码scene1.unity) 1.创建Plane实例P1,P2,两者之间出现一条鸿沟.直接控制角色位移是无法通过的. 2.打开Navigation窗口,分别选中P1,P2, ...
- Django 搭建简易博客
新增一个 APP 博客算是一个功能集,因此我们应将其体现为一个模块.这表现在 Django 应用里则是为其创建一个 APP Package.现在让 manage.py 中的 startapp 闪亮登场 ...
- Html5选择本地视频音频文件播放
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- CQOI 2016 不同的最小割
题目大意:一个无向图,求所有点对不同的最小割种类数 最小割最多有n-1个,这n-1个最小割构成一个最小割树 分治法寻找n-1个最小割.对于当前点集X,任选两点为ST做最小割,然后找出与S相连的所有点和 ...