SET QUOTED_IDENTIFIER (Transact-SQL)

适用于: SQL Server Azure SQL 数据库 Azure SQL 托管实例 Azure Synapse Analytics 分析平台系统 (PDW) Microsoft Fabric 中的 SQL 分析端点 Microsoft Fabric 中的仓库

使 SQL Server 遵从关于引号分隔标识符和文字字符串的 ISO 规则。 由双引号分隔的标识符可以是 Transact-SQL 保留关键字,也可以包含 Transact-SQL 标识符语法规则通常不允许的字符。

Transact-SQL 语法约定

语法

Azure Synapse Analytics 中的 SQL Server、Azure SQL 数据库、无服务器 SQL 池和 Microsoft Fabric 的语法。

SET QUOTED_IDENTIFIER { ON | OFF }

Azure Synapse Analytics 和并行数据仓库的语法。

SET QUOTED_IDENTIFIER ON

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

注解

如果为 ON SET QUOTED_IDENTIFIER (默认值),标识符可以用双引号分隔(""),文本必须用单引号('') 分隔。 所有用双引号分隔的字符串都被解释为对象标识符。 加引号的标识符不必遵守 Transact-SQL 标识符规则。 它们可以是关键字,并且可以包含 Transact-SQL 标识符中不允许的字符。 如果双引号 (") 是标识符的一部分,则可以用两个双引号 ("") 来表示它。 SET QUOTED_IDENTIFIER 必须 ON 当保留关键字用于数据库中的对象名称时。

如果为<a0/>,SET QUOTED_IDENTIFIER则不能引用标识符,并且必须遵循标识符的所有 Transact-SQL 规则。 有关详细信息,请参阅 数据库标识符。 文字可以由单引号或双引号分隔。 如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。

注意

QUOTED_IDENTIFIER 不会影响括在方括号([])中的分隔标识符。

在创建或更改计算列的索引或索引视图时,SET QUOTED_IDENTIFIER 必须为 ON。 如果SET QUOTED_IDENTIFIEROFF,则INSERTCREATEUPDATE为计算列的索引的表或具有索引视图的表,以及DELETE语句失败。 有关包含计算列的索引视图和索引的必需 SET 选项设置的详细信息,请参阅 使用 SET 语句时的注意事项。

SET QUOTED_IDENTIFIER 必须是 ON 创建筛选索引时。

SET QUOTED_IDENTIFIER 必须是 ON 调用 xml 数据类型方法时。

SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB Provider for SQL Server 在连接时会自动设置为QUOTED_IDENTIFIERON该提供程序。 这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。 默认用于SET QUOTED_IDENTIFIEROFF从 DB-Library 应用程序建立的连接。

创建表时,QUOTED IDENTIFIER即使该选项设置为OFF创建表时,该选项也始终存储在ON表的元数据中。

创建存储过程时, SET QUOTED_IDENTIFIER 将捕获设置 SET ANSI_NULLS 并用于该存储过程的后续调用。

在存储过程内执行时,不会更改设置 SET QUOTED_IDENTIFIER

ONQUOTED_IDENTIFIER何时SET ANSI_DEFAULTS,也是ON

SET QUOTED_IDENTIFIER对应于 QUOTED_IDENTIFIER ALTER DATABASE 的设置

SET QUOTED_IDENTIFIER 在 Transact-SQL 分析时生效,只会影响分析,不影响查询优化或查询执行。

对于顶级即席批处理,分析开始使用会话的当前设置。QUOTED_IDENTIFIER 当批处理分析发生的任何更改时 SET QUOTED_IDENTIFIER ,分析行为会从该点打开,并为会话保存该设置。 因此,在对批处理进行分析和执行后,将根据批处理中的最后一SET QUOTED_IDENTIFIER个匹配项设置会话QUOTED_IDENTIFIER设置。

使用创建或更改存储过程的批处理的设置分析 QUOTED_IDENTIFIER 存储过程中的静态 Transact-SQL。 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;

权限

要求 公共 角色具有成员身份。

示例

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;
GO

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