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 的设置,用于分析对象执行失败的原因。
QUOTED_IDENTIFIER 是 SQL Server 中影响 SQL 语法解析和数据库对象创建的重要设置之一。它决定了双引号是否可以用于包裹标识符,如列名、表名、别名等。在创建索引视图、计算列、XML 索引等对象时,该设置必须为 ON,否则会导致创建失败。
以上就是php小编整理的全部内容,希望对您有所帮助,更多相关资料请查看php教程栏目。
-
HTML中marquee标签的属性参数和用法详解 时间:2025-08-12
-
Android中TranslateAnimation详解(参数、用法、应用场景) 时间:2025-08-12
-
C#中Attributes.Add的作用及用法详解 时间:2025-08-12
-
华为交换机配置命令详解及实例 时间:2025-08-12
-
网页右下角弹窗广告怎么去除?网页弹窗广告怎么彻底清除? 时间:2025-08-12
-
DropDownList控件的常用属性和方法有哪些? 时间:2025-08-12
今日更新
-
最近火梗是什么梗-全网爆火新梗大盘点揭秘最新热梗出处
阅读:18
-
最近夸自己的梗是什么梗-最新自夸流行梗揭秘让你秒变社交达人
阅读:18
-
最近流行的梗都是什么梗-2024最新爆火网络热梗大盘点
阅读:18
-
最近流行的梗是什么梗-最新爆火网络梗大盘点快来get
阅读:18
-
最近流行的假梗是什么梗-揭秘全网疯传的假梗真相
阅读:18
-
最近龙主的梗是什么梗-揭秘网络爆火梗背后的搞笑真相
阅读:18
-
最近骆驼梗是什么梗-揭秘网络爆火骆驼梗的由来和玩法
阅读:18
-
最近那个漫画梗是什么梗全网爆火-揭秘漫画圈最新流行梗出处和笑点
阅读:18
-
最近汽车的梗都是什么梗-揭秘爆火车圈新梗让你秒懂潮流
阅读:18
-
最近鳝鱼是什么梗揭秘网红吃播新宠-黄鳝门事件后为何再成热点
阅读:18