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 ...
随机推荐
- 每天一个linux命令--定时启动
1.设置启动的时间,输入crontab -e命令 设置一种编辑器,进入编辑界面,设置启动的时间为每5分钟启动一次wanghy.sh脚本 # m h dom mon dow command # */ * ...
- DXUT源码阅读笔记
14.GetCapture() 函数功能:该函数取得捕获了鼠标的窗口(如果存在)的句柄.在同一时刻,只有一个窗口能捕获鼠标:此时,该窗口接收鼠标的输入,无论光标是否在其范围内.函数原型:HWND Ge ...
- underscorejs 源码走读笔记
Underscore 简介 Underscore 是一个JavaScript实用库,提供了类似Prototype.js的一些功能,但是没有继承任何JavaScript内置对象.它弥补了部分jQuery ...
- bzoj1009矩阵快速面+kmp
其实kmp真的很次要,求长度为20的kmp感觉真的有点杀鸡用牛刀 这题思路相当明确:一看题就是数位dp,一看n的大小就是矩阵 矩阵的构造用m*m比较方便,本来想写1*m的矩阵乘m*m的,但是感觉想起来 ...
- tornado学习笔记11 Web应用中模板(Template)使用应用实践
上一篇中(Web应用中模板的工作流程分析),已经分析了模板的渲染流程,以及相关参数获取及设置原理.这篇主要讲述模板在实际应用案例. 11.1 需求 根据用户输入的两次密码,判断两次密码是否一致,并将判 ...
- JS键盘KEYCODE值参考
keycode 1 = 鼠标左键keycode 2 = 鼠标右键keycode 3 = Cancelkeycode 4 = 鼠标中键keycode 8 = BackSpace keycode 9 = ...
- 转载:Hadoop排序工具用法小结
本文转载自Silhouette的文章,原文地址:http://www.dreamingfish123.info/?p=1102 Hadoop排序工具用法小结 发表于 2014 年 8 月 25 日 由 ...
- 【Beta】Daily Scrum Meeting第五次
1.任务进度 学号 已完成 接下去要做 502 登陆时将返回的个人信息更新到本地数据库 发布任务到服务器 509 给所有api添加注释 添加及修改职工信息并同步到服务器 517 将提交报课移到报课表界 ...
- WebService的一些案例
既然要实现WebService,首先先来创建一个Service类 package cn.happy.webservice; import javax.jws.WebService; import ja ...
- 浅谈PHP7新特性
1. 运算符(NULL 合并运算符) 把这个放在第一个说是因为我觉得它很有用.用法: $a = $_GET['a'] ?? 1; 它相当于: $a = isset($_GET['a']) ? $_GE ...