SET QUOTED_IDENTIFIER (Transact-SQL)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例Azure Synapse AnalyticsAnalytics Platform System (PDW)Microsoft Fabric 中的 SQL 分析终结点Microsoft Fabric 中的仓库

使 SQL Server 遵从关于引号分隔标识符和文字字符串的 ISO 规则。 由双引号分隔的标识符可以是 Transact-SQL 保留关键字,也可以包含 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_executesqlexec() 的嵌套批处理,使用会话的 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 设置为 ONOFF 时,在字符串表达式中使用单引号和双引号的方式。

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
数据库标识符