+ -

SQL Server中QUOTED_IDENTIFIER使用详解(作用、使用场景、配置方法)

时间:2025-08-12

来源:互联网

在手机上看
手机扫描阅读

在 SQL Server 的开发和维护过程中,QUOTED_IDENTIFIER 是一个常被忽视但非常关键的会话设置。它控制 SQL 语句中使用双引号包裹标识符(如列名、表名)的行为,影响查询的兼容性、执行逻辑以及索引视图、函数等对象的创建。合理设置 QUOTED_IDENTIFIER,是构建稳定、可移植数据库对象的重要保障。本文将深入解析 QUOTED_IDENTIFIER 的作用机制、使用场景以及配置方法,帮助开发者理解其在 SQL Server 中的重要作用。

一、QUOTED_IDENTIFIER 的基本作用

QUOTED_IDENTIFIER 是 SQL Server 中用于控制是否允许使用双引号作为标识符定界符的设置。它的默认状态通常为 ON,表示双引号可以用于包裹标识符,如表名、列名、别名等。

  • 当 QUOTED_IDENTIFIER 设置为 ON 时:

  • 双引号 " 可用于包裹标识符;

    可以使用保留关键字作为列名或表名(如 SELECT "order" FROM "user");

    适用于索引视图、计算列、XML 索引等依赖特定设置的对象;

    与 ANSI SQL 标准更兼容。

  • 当 QUOTED_IDENTIFIER 设置为 OFF 时:

  • 双引号将被视为字符串定界符,不能用于标识符;

    保留关键字不能直接作为列名或表名使用;

    可能影响某些数据库对象的创建;

    不推荐用于生产环境,仅在兼容性要求特殊时使用。

    示例:

    SETQUOTED_IDENTIFIERON;
    --使用双引号包裹标识符
    SELECT"Name","Order"FROM"Customers";
    --创建包含保留关键字的列名
    CREATETABLE"Orders"(
    "ID"INT,
    "Order"VARCHAR(50)
    );

    二、QUOTED_IDENTIFIER 的使用场景

  • 使用双引号包裹标识符

  • SQL Server 默认使用方括号 [] 来包裹特殊标识符,但 QUOTED_IDENTIFIER ON 后,开发者可以使用 " " 代替 [],提高 SQL 语句的可读性:

    SETQUOTED_IDENTIFIERON;
    SELECT"name","user"FROM"users";
  • 在索引视图中使用

  • 索引视图(Indexed View)是 SQL Server 中用于优化查询性能的重要机制,但其创建时要求 QUOTED_IDENTIFIER 必须为 ON,否则会抛出错误。

    CREATEVIEWdbo.vw_CustomerOrders
    WITHSCHEMABINDING
    AS
    SELECT...
  • 创建带 XML 索引的表

  • 如果表中包含 XML 类型的列,并且需要创建 XML 索引,必须在 QUOTED_IDENTIFIER 为 ON 的情况下执行。

    SETQUOTED_IDENTIFIERON;
    CREATEPRIMARYXMLINDEXPXML_CustomerData
    ONdbo.Customers(CustomerXML);
  • 支持计算列索引

  • 如果某个计算列被持久化并用于创建索引,也需要 QUOTED_IDENTIFIER 为 ON。

    SETQUOTED_IDENTIFIERON;
    ALTERTABLEEmployees
    ADDFullNameAS(FirstName+''+LastName)PERSISTED;
  • SQL 脚本的跨数据库迁移

  • 在从其他数据库(如 Oracle、MySQL)迁移 SQL 脚本时,若原脚本使用双引号包裹标识符,需设置 QUOTED_IDENTIFIER ON 才能兼容执行。

  • ORM 框架生成的 SQL 语句

  • 某些 ORM 框架(如 Hibernate、EF)生成的 SQL 语句使用双引号包裹标识符,此时必须启用该设置,否则会抛出语法错误。

  • 存储过程、触发器、函数中使用

  • 尽管 QUOTED_IDENTIFIER 是会话设置,但存储过程、触发器等数据库对象在创建时也会继承该设置。为了确保对象在创建时成功,应保持 QUOTED_IDENTIFIER 为 ON。

  • 与 ANSI_NULLS 设置配合使用

  • 在创建索引视图、计算列索引等对象时,除了 QUOTED_IDENTIFIER,还需设置 ANSI_NULLS ON,否则无法创建。

    SETANSI_NULLSON;
    SETQUOTED_IDENTIFIERON;
    GO
    CREATEVIEWdbo.vw_EmployeeDetails
    WITHSCHEMABINDING
    AS
    SELECT...
  • 调试或运行第三方 SQL 脚本

  • 如果运行的 SQL 脚本中使用了双引号包裹列名或表名,而未设置 QUOTED_IDENTIFIER ON,脚本将无法执行。

  • SQL Server Agent 作业中使用

  • 在 SQL Server Agent 作业中执行 SQL 脚本时,如果脚本依赖双引号包裹标识符,应在作业脚本开头设置:

    SETQUOTED_IDENTIFIERON;

    三、QUOTED_IDENTIFIER 的设置方式

  • 在查询窗口中手动设置

  • SETQUOTED_IDENTIFIERON;

    ON 表示允许双引号作为标识符;

    OFF 表示双引号不能用于标识符。

  • 在创建或修改数据库对象时自动继承设置

  • SQL Server 中的存储过程、函数、触发器等对象在创建时会记录当前 QUOTED_IDENTIFIER 的设置状态。之后调用该对象时,即使会话中设置为 OFF,对象仍会以创建时的设置运行。

  • 在连接字符串中指定设置

  • 某些客户端连接 SQL Server 时,可以指定连接时的 QUOTED_IDENTIFIER 设置:

    stringconnectionString="Server=myServer;Database=myDB;Trusted_Connection=True;QuotedId=Yes;";
  • 通过 SSMS 设置默认行为

  • 在 SQL Server Management Studio 中,可以通过“工具 → 选项 → 查询执行 → SQL Server → ANSI”中设置默认的 QUOTED_IDENTIFIER 状态。

  • 在 SQL 脚本中配合 GO 批处理使用

  • SETQUOTED_IDENTIFIERON;
    GO
    SELECT"name"FROM"users";

    注意:GO 是批处理分隔符,SET 命令仅在当前批处理中生效。

  • 查看当前会话的设置状态

  • 可以使用以下语句查看当前会话的 QUOTED_IDENTIFIER 设置:

    DBCCUSEROPTIONS;

    输出中会显示 quoted identifier 的当前状态。

  • 在存储过程或函数中设置

  • 创建存储过程时,SQL Server 会自动记录 QUOTED_IDENTIFIER 的设置:

    SETQUOTED_IDENTIFIERON;
    GO
    CREATEPROCEDUREusp_GetCustomers
    AS
    BEGIN
    SELECT"name","address"FROM"customers";

    END存储过程创建后,其设置状态会被保存,后续调用时仍会使用该设置。

  • 修改已存在的存储过程的设置

  • 如果已存在的存储过程使用了双引号,但在创建时 QUOTED_IDENTIFIER 为 OFF,可以重新创建存储过程并启用该设置:

    --删除原有存储过程
    DROPPROCEDUREusp_GetCustomers;
    --重新创建并启用QUOTED_IDENTIFIER
    SETQUOTED_IDENTIFIERON;
    GO
    CREATEPROCEDUREusp_GetCustomers
    AS
    BEGIN
    SELECT"name"FROM"customers";
    END
  • 配置连接默认设置(如 ODBC、ADO.NET)

  • 在使用 ODBC、OLE DB、ADO.NET 等方式连接 SQL Server 时,可以在连接时指定 QUOTED_IDENTIFIER 的默认行为,以确保远程客户端与数据库设置一致。

  • 通过 SQL Server Profiler 捕获设置

  • 在调试或分析数据库行为时,可以使用 SQL Server Profiler 捕获 SET QUOTED_IDENTIFIER 的设置,用于分析对象执行失败的原因。

    SQL Server中QUOTED_IDENTIFIER使用详解(作用、使用场景、配置方法)

    QUOTED_IDENTIFIER 是 SQL Server 中影响 SQL 语法解析和数据库对象创建的重要设置之一。它决定了双引号是否可以用于包裹标识符,如列名、表名、别名等。在创建索引视图、计算列、XML 索引等对象时,该设置必须为 ON,否则会导致创建失败。

    以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。

    热门下载

    更多