zoukankan      html  css  js  c++  java
  • SET QUOTED_IDENTIFIER

    SQL SERVER的联机丛书的解释:
    “当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。”

    先说说什么是标识符,举个例子,如果创建了一个叫做USER的数据库表,则直接用SQL语句“SELECT * FROM USER”做查询时会报错:“在关键字 'USER' 附近有语法错误。”,也就是USER被视作SQL SERVER的关键字处理了,而不是被认为是一个表或视图。但如果修改为“SELECT * FROM [USER]”就没问题了。此处的方括号里面就是标识符。标识符的作用就是告诉数据库引擎,此处是一个数据库对象(比如是一个表、视图、存储过程等),而不是一个关键字。
    标识符分类:
      1.常规标识符
     符合标识符的格式规则。在 Transact-SQL 语句中使用常规标识符时可以不将其分隔开。
     SELECT * FROM TableX  WHERE KeyCol = 124
      2.分隔标识符
     包含在双引号 (") 或者方括号 ([ ]) 内。符合标识符格式规则的标识符可以分隔,也可以不分隔。
        在 Transact-SQL 语句中,必须对不符合所有标识符规则的标识符进行分隔。

    在SQL SERVER中,方括号是分隔符,但不仅仅是方括号可以做分隔符。在特定的情况下,双引号也可以做分隔符,也就是前面的sql语句可以修改为“SELECT * FROM "USER"”,而这个特定的情况也就是SET QUOTED_IDENTIFIER ON的情况下。当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。而在其值为OFF时,双引号被解释为字符串的边界,和单引号的作用是类似的。比如如下几组SQL 语句都是正确的(假设USER表有一个a的varchar型的字段)


    SET QUOTED_IDENTIFIER ON
    SELECT * FROM "USER"    WHERE a='netasp'

    SET QUOTED_IDENTIFIER ON
    SELECT * FROM [USER] WHERE a='netasp'

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM [USER]    WHERE a="netasp"

    SET QUOTED_IDENTIFIER OFF
    SELECT * FROM [USER]    WHERE a= ' 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 的默认数据库设置。原来如此!!!

  • 相关阅读:
    [eslintpluginvue] [vue/nounusedvars] 'scope' is defined but never used.
    Vue项目中添加锁屏功能
    前端文档汇总(含代码规范、开发流程、知识分享,持续更新)
    vscode格式化Vue出现的问题
    下盘不稳 被忽视的项目风险
    项目沟通中的一点经验心得
    如何才能更合理地分配项目奖金?
    关于企业的薪酬体系之思考
    导致项目失败的两大隐形杀手
    如何让项目总结会议更有效果?
  • 原文地址:https://www.cnblogs.com/jshchg/p/1995092.html
Copyright © 2011-2022 走看看