SET QUOTED_IDENTIFIER (Transact-SQL)
适用于:Microsoft Fabric Microsoft Fabric Warehouse 中的 SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics Analytics Platform System (PDW) SQL Analytics 终结点
使 SQL Server 遵从关于引号分隔标识符和文字字符串的 ISO 规则。 由双引号分隔的标识符可以是 Transact-SQL 保留关键字,也可以包含 Transact-SQL 标识符语法规则通常不允许的字符。
语法
-- Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics, and Microsoft Fabric
SET QUOTED_IDENTIFIER { ON | OFF }
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
SET QUOTED_IDENTIFIER ON
注意
若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档。
注解
SET QUOTED_IDENTIFIER
为 ON(默认)时,可以用双引号 (" ") 分隔标识符,而文字必须用单引号 (' ') 来分隔。 所有用双引号分隔的字符串都被解释为对象标识符。 因此,加引号的标识符不必符合 Transact-SQL 标识符规则。 它们可以是保留关键字,并且可以包含 Transact-SQL 标识符中通常不允许的字符。 不能使用双引号分隔文字字符串表达式,而必须用单引号括住文字字符串。 如果单引号 (') 是文本字符串的一部分,则可用两个单引号 ('') 表示。 当对数据库中的对象名使用保留关键字时,SET QUOTED_IDENTIFIER
必须为 ON。
当 SET QUOTED_IDENTIFIER
为 OFF 时,标识符不可加引号,且必须符合所有 Transact-SQL 标识符规则。 有关详细信息,请参阅 Database Identifiers。 文字可以由单引号或双引号分隔。 如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。
备注
QUOTED_IDENTIFIER 不影响括在方括号 ([ ]) 中的分隔标识符。
在创建或更改计算列的索引或索引视图时,SET QUOTED_IDENTIFIER
必须为 ON。 如果 SET QUOTED_IDENTIFIER
为 OFF,则对计算列或索引视图的索引所在的表执行 CREATE、UPDATE、INSERT 和 DELETE 语句将失败。 有关计算列的索引视图和索引所需的 SET 选项设置的详细信息,请参阅使用 SET 语句时的注意事项。
创建筛选索引时,SET QUOTED_IDENTIFIER
必须为 ON。
调用 XML 数据类型方法时,SET QUOTED_IDENTIFIER
必须为 ON。
在进行连接时,SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB Provider for SQL Server 自动将 QUOTED_IDENTIFIER 设置为 ON。 这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。 对来自 DB-Library 应用程序的连接,SET QUOTED_IDENTIFIER 默认设置为 OFF。
创建表时,即使此时将 QUOTED IDENTIFIER 选项设置为 OFF,该选项在表的元数据中仍始终存储为 ON。
创建存储过程时,将捕获 SET QUOTED_IDENTIFIER 和 SET ANSI_NULLS 设置,并用于该存储过程的后续调用。
在存储过程内执行 SET QUOTED_IDENTIFIER 时,其设置不更改。
SET ANSI_DEFAULTS
为 ON 时,QUOTED_IDENTIFIER 也为 ON。
SET QUOTED_IDENTIFIER
还与 ALTER DATABASE 的 QUOTED_IDENTIFIER 设置相对应。
SET QUOTED_IDENTIFIER
在 Transact-SQL 分析时生效,只会影响分析,不影响查询优化或查询执行。
对于顶级即席批处理,请使用会话的当前 QUOTED_IDENTIFIER 设置开始分析。 分析批处理时,只要出现 SET QUOTED_IDENTIFIER
,就会更改之后的分析行为,并保存会话的设置。 因此,在对批处理进行分析和执行后,会话的QUOTED_IDENTIFIER设置将根据批处理中的最后一 SET QUOTED_IDENTIFIER
个匹配项进行设置。
存储过程中的静态 Transact-SQL 是使用对于创建或更改存储过程的批处理有效的 QUOTED_IDENTIFIER 设置分析的。 SET QUOTED_IDENTIFIER
作为静态 Transact-SQL 出现在存储过程的正文中时是无效的。
对于使用 sp_executesql
或 exec()
的嵌套批处理,使用会话的 QUOTED_IDENTIFIER 设置开始进行分析。 如果嵌套批处理在存储过程内,则使用存储过程的 QUOTED_IDENTIFIER 设置开始进行分析。 分析嵌套批处理时,只要出现 SET QUOTED_IDENTIFIER
,就会改变之后的分析行为,但不会更新会话的 QUOTED_IDENTIFIER 设置。
要查看此设置的当前设置,请运行以下查询:
DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 )
BEGIN
SET @QUOTED_IDENTIFIER = 'ON';
END
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;
权限
要求具有 PUBLIC
角色的成员身份。
示例
A. 使用加引号的标识符设置和保留字对象名
以下示例显示 SET QUOTED_IDENTIFIER
设置必须为 ON
,而且表名内的关键字必须在双引号内,才能创建和使用具有保留关键字名称的对象。
SET QUOTED_IDENTIFIER OFF
GO
-- Create statement fails.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO
SET QUOTED_IDENTIFIER ON;
GO
-- Create statement succeeds.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO
SELECT "identity","order"
FROM "select"
ORDER BY "order";
GO
DROP TABLE "SELECT";
GO
SET QUOTED_IDENTIFIER OFF;
GO
B. 使用加单引号和双引号的标识符设置
以下示例显示将 SET QUOTED_IDENTIFIER
设置为 ON
和 OFF
时,在字符串表达式中使用单引号和双引号的方式。
SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2022;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Test')
DROP TABLE dbo.Test;
GO
USE AdventureWorks2022;
CREATE TABLE dbo.Test (ID INT, String VARCHAR(30)) ;
GO
-- Literal strings can be in single or double quotation marks.
INSERT INTO dbo.Test VALUES (1, "'Text in single quotes'");
INSERT INTO dbo.Test VALUES (2, '''Text in single quotes''');
INSERT INTO dbo.Test VALUES (3, 'Text with 2 '''' single quotes');
INSERT INTO dbo.Test VALUES (4, '"Text in double quotes"');
INSERT INTO dbo.Test VALUES (5, """Text in double quotes""");
INSERT INTO dbo.Test VALUES (6, "Text with 2 """" double quotes");
GO
SET QUOTED_IDENTIFIER ON;
GO
-- Strings inside double quotation marks are now treated
-- as object names, so they cannot be used for literals.
INSERT INTO dbo."Test" VALUES (7, 'Text with a single '' quote');
GO
-- Object identifiers do not have to be in double quotation marks
-- if they are not reserved keywords.
SELECT ID, String
FROM dbo.Test;
GO
DROP TABLE dbo.Test;
GO
SET QUOTED_IDENTIFIER OFF;
GO
下面是结果集。
ID String
----------- ------------------------------
1 'Text in single quotes'
2 'Text in single quotes'
3 Text with 2 '' single quotes
4 "Text in double quotes"
5 "Text in double quotes"
6 Text with 2 "" double quotes
7 Text with a single ' quote
另请参阅
CREATE DATABASE
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
数据类型
EXECUTE
SELECT
SET 语句
SET ANSI_DEFAULTS
sp_rename
数据库标识符
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈