QUOTED_IDENTIFIER设置会导致SQL Server遵循引号 delimiting 标识符和文本字符串的 ISO 规则。 如果使用双引号分隔标识符,则可以使用Transact-SQL保留关键字,或者包含通常不允许在标识符中使用Transact-SQL语法规则的字符。
语法
Azure Synapse Analytics中的 SQL Server、Azure SQL 数据库、无服务器 SQL 池和Microsoft Fabric的语法。
SET QUOTED_IDENTIFIER { ON | OFF }
Azure Synapse Analytics和并行Data Warehouse的语法。
SET QUOTED_IDENTIFIER ON
注解
如果设置为 SET QUOTED_IDENTIFIERON (默认值),可以使用双引号 ("") 分隔标识符,并且必须使用单引号 ('') 来分隔文本。 括在双引号中的所有字符串都解释为对象标识符。 带引号的标识符不需要遵循标识符的Transact-SQL规则。 它们可以是关键字,可以包含Transact-SQL标识符中不允许的字符。 如果双引号 (") 是标识符的一部分,则可以用两个双引号 ("") 来表示它。 在数据库中对对象名称使用保留关键字时,必须设置为SET QUOTED_IDENTIFIERON该关键字。
将 SET QUOTED_IDENTIFIER 设置为 OFF 时,不能引用标识符,并且它们必须遵循标识符的所有Transact-SQL规则。 有关详细信息,请参阅 数据库标识符。 可以通过单引号或双引号分隔文本。 如果用双引号分隔文本字符串,则字符串可以包含嵌入的单引号,例如撇号。
注意
QUOTED_IDENTIFIER 不会影响括在方括号([ 和 ])中的分隔标识符。
在计算列或索引视图上创建或更改索引时,必须设置为SET QUOTED_IDENTIFIERON该设置。 如果设置为 SET QUOTED_IDENTIFIEROFF、CREATE、 UPDATEINSERT和DELETE语句,则计算列的索引表或具有索引视图的表失败。 有关包含计算列的索引视图和索引的必需 SET 选项设置的详细信息,请参阅 使用 SET 语句时的注意事项。
创建筛选索引时,必须设置为SET QUOTED_IDENTIFIERON该设置。
调用 xml 数据类型方法时,必须设置为SET QUOTED_IDENTIFIERON该设置。
用于SQL Server的 SQL Server Native Client ODBC 驱动程序和 SQL Server Native Client OLE DB 提供程序在连接时自动将 QUOTED_IDENTIFIER 设置为 ON。 可以在 ODBC 数据源、ODBC 连接属性或 OLE DB 连接属性中配置此设置。 默认用于SET QUOTED_IDENTIFIEROFF从 DB-Library 应用程序建立的连接。
创建表时,表的元数据始终存储QUOTED_IDENTIFIER该选项,就像在创建表时将选项设置为一OFF样ON。
创建存储过程时, SET QUOTED_IDENTIFIER 将捕获和 SET ANSI_NULLS 设置,并用于该存储过程的后续调用。
在存储过程内执行 SET QUOTED_IDENTIFIER 时,设置不会更改。
SET ANSI_DEFAULTS
ON设置为时,QUOTED_IDENTIFIER也设置为 ON。
SET QUOTED_IDENTIFIER对应于 QUOTED_IDENTIFIER ALTER DATABASE 的设置。
SET QUOTED_IDENTIFIER在 Transact-SQL分析时生效,并且仅影响分析,而不会影响查询优化或查询执行。
对于顶级即席批处理,分析开始使用会话的当前设置。QUOTED_IDENTIFIER 分析批处理时,任何发生 SET QUOTED_IDENTIFIER 更改该点的分析行为,并为会话保存该设置。 因此,在对批处理进行分析和执行后,根据批处理中的最后一SET QUOTED_IDENTIFIER个匹配项设置会话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 AS 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. 将带引号的标识符设置与单引号和双引号一起使用
以下示例演示如何在设置为ON和OFF的字符串表达式SET QUOTED_IDENTIFIER中使用单引号和双引号。
SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2025;
GO
IF EXISTS (SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'Test')
DROP TABLE dbo.Test;
GO
USE AdventureWorks2025;
GO
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 DEFAULT (Transact-SQL)
- CREATE PROCEDURE (Transact-SQL)
- CREATE RULE (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- CREATE TRIGGER (Transact-SQL)
- CREATE VIEW (Transact-SQL)
- 数据类型(Transact-SQL)
- EXECUTE (Transact-SQL)
- SELECT (Transact-SQL)
- SET 语句(Transact-SQL)
- SET ANSI_DEFAULTS(Transact-SQL)
- sp_rename
- 数据库标识符