zoukankan      html  css  js  c++  java
  • 关于SET QUOTED_IDENTIFIER {ON|OFF}的问题

    先来看看下面的代码:

    SET QUOTED_IDENTIFIER ON
    GO
    Create Procedure dbo.ACG_CEL_GET_ISSUE_TYPES
        @intIssueTypeId int = 0,
        @intAppId int = 0
    as
    BEGIN
        Select
            I.id,
            I.name
        From
            celoxis.db_issue_type I (nolock)
        Where
            (I.id = @intIssueTypeId OR @intIssueTypeId = 0)
            AND (I.App_id = @intAppId OR @intAppId = 0)
        Order By
            I.name
    END

    GO
    SET QUOTED_IDENTIFIER OFF
    GO

    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表有一个avarchar型的字段)


    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联机丛书说OFFSET 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_IDEN

    TIFIER 的默认数据库设置。原来如此!!!

  • 相关阅读:
    【JVM】程序计数器(四)
    【JVM】运行时数据区概述及线程(三)
    【JVM】类加载子系统(二)
    MyException--org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession. ###
    计算机常用指令大全
    HTML的设计与应用
    想得太多,又做的太少
    互联网数据库分库分表现状及一点思考
    python中的函数与文件操作
    python中的流程控制语句
  • 原文地址:https://www.cnblogs.com/Candy/p/1281761.html
Copyright © 2011-2022 走看看