关于SET QUOTED_IDENTIFIER {ON|OFF}的问题
2009-11-06 14:39
288 查看
SQL SERVER的联机丛书的解释:
“当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。”
先说说什么是标识符,举个例子,如果创建了一个叫做USER的数据库表,则直接用SQL语句“SELECT * FROM USER”做查询时会报错:“在关键字 'USER' 附近有语法错误。”,也就是USER被视作SQL SERVER的关键字处理了,而不是被认为是一个表或视图。但如果修改为“SELECT * FROM [USER]”就没问题了。此处的方括号就是标识符。标识符的作用就是告诉数据库引擎,此处是一个数据库对象(比如是一个表、视图、存储过程等),而不是一个关键字。
在SQL SERVER中,方括号是标识符,但不仅仅是方括号可以做标识符。在特定的情况下,双引号也可以做标识符,也就是前面的sql语句可以修改为“SELECT * FROM "USER"”,而这个特定的情况也就是SET QUOTED_IDENTIFIER ON的情况下。当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。而在其值为OFF时,双引号被解释为字符串的边界,和单引号的作用是类似的。比如如下几组SQL 语句都是正确的(假设USER表有一个U_NAME的varchar型的字段)
SET QUOTED_IDENTIFIER ON
SELECT * FROM "USER" WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER ON
SELECT * FROM [USER] WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME="netasp"
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME='netasp'
现在剩下最后一个小问题了,SQL SERVER联机丛书说OFF是SET QUOTED_IDENTIFIER的默认值,那如果我们省略掉SET QUOTED_IDENTIFIER语句和写了SET QUOTED_IDENTIFIER OFF应该效果一致才对,但事实证明省略掉SET QUOTED_IDENTIFIER语句和SET QUOTED_IDENTIFIER ON语句才是一致的,这又是为什么呢?原来在默认情况下,连接到 SQL Server 时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将 QUOTED_IDENTIFIER 设置为 ON。而连接级设置(使用 SET 语句设置)会替代 QUOTED_IDENTIFIER 的默认数据库设置。原来如此!!!
“当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。”
先说说什么是标识符,举个例子,如果创建了一个叫做USER的数据库表,则直接用SQL语句“SELECT * FROM USER”做查询时会报错:“在关键字 'USER' 附近有语法错误。”,也就是USER被视作SQL SERVER的关键字处理了,而不是被认为是一个表或视图。但如果修改为“SELECT * FROM [USER]”就没问题了。此处的方括号就是标识符。标识符的作用就是告诉数据库引擎,此处是一个数据库对象(比如是一个表、视图、存储过程等),而不是一个关键字。
在SQL SERVER中,方括号是标识符,但不仅仅是方括号可以做标识符。在特定的情况下,双引号也可以做标识符,也就是前面的sql语句可以修改为“SELECT * FROM "USER"”,而这个特定的情况也就是SET QUOTED_IDENTIFIER ON的情况下。当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。而在其值为OFF时,双引号被解释为字符串的边界,和单引号的作用是类似的。比如如下几组SQL 语句都是正确的(假设USER表有一个U_NAME的varchar型的字段)
SET QUOTED_IDENTIFIER ON
SELECT * FROM "USER" WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER ON
SELECT * FROM [USER] WHERE U_NAME='netasp'
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME="netasp"
SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME='netasp'
现在剩下最后一个小问题了,SQL SERVER联机丛书说OFF是SET QUOTED_IDENTIFIER的默认值,那如果我们省略掉SET QUOTED_IDENTIFIER语句和写了SET QUOTED_IDENTIFIER OFF应该效果一致才对,但事实证明省略掉SET QUOTED_IDENTIFIER语句和SET QUOTED_IDENTIFIER ON语句才是一致的,这又是为什么呢?原来在默认情况下,连接到 SQL Server 时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将 QUOTED_IDENTIFIER 设置为 ON。而连接级设置(使用 SET 语句设置)会替代 QUOTED_IDENTIFIER 的默认数据库设置。原来如此!!!
文章引用自 http://www.spbdev.com/Blog/BlogIndex.aspx?u=netasp |
相关文章推荐
- 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题
- 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题
- 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题
- 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题
- SET QUOTED_IDENTIFIER {ON|OFF}的问题(Membership阅读不通)
- set ansi_nulls [on/off] 与 set quoted_identifier [on/off]
- SQL Server中的Set Quoted_Identifier On/Off命令
- SET QUOTED_IDENTIFIER {ON|OFF}和SET ANSI_NULLS {ON | OFF}
- 关于SET QUOTED_IDENTIFIER {ONOFF}的问题
- SQL存储过程中的几个常见设定SET QUOTED_IDENTIFIER/NOCOUNT/XACT_ABORT ON/OFF
- 关于 Missing contentDescription attribute on image 警告的问题解决
- 关于plsql下提示ORA-00904:Invalid identifier错误的问题----创建表时字段加了引号
- 关于onpropertychange与oninput的兼容问题
- 关于API 23 中Fragment的public void onAttach(Context context) 没有被调用的问题
- 关于Fragment中的onActivityResult的回调问题
- 关于鼠标事件oncontextmenu和onselectstart的js写法问题
- RXSwift 关于使用textFiled的时候onCompleted 什么时间执行的问题
- 关于syntax error : missing ';' before identifier 'PVOID64' 问题
- SQL点滴1—SET QUOTED_IDENTIFIER OFF语句的作用
- SET QUOTED_IDENTIFIER OFF语句的作用