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 标识符语法规则通常不允许的字符。
语法
Azure Synapse Analytics 中的 SQL Server、Azure SQL 数据库、无服务器 SQL 池和 Microsoft Fabric 的语法。
SET QUOTED_IDENTIFIER { ON | OFF }
Azure Synapse Analytics 和并行数据仓库的语法。
SET QUOTED_IDENTIFIER ON
注解
如果为 ON
SET QUOTED_IDENTIFIER
(默认值),标识符可以用双引号分隔(""
),文本必须用单引号(''
) 分隔。 所有用双引号分隔的字符串都被解释为对象标识符。 加引号的标识符不必遵守 Transact-SQL 标识符规则。 它们可以是关键字,并且可以包含 Transact-SQL 标识符中不允许的字符。 如果双引号 ("
) 是标识符的一部分,则可以用两个双引号 (""
) 来表示它。 SET QUOTED_IDENTIFIER
必须 ON
当保留关键字用于数据库中的对象名称时。
如果为<SET QUOTED_IDENTIFIER
则不能引用标识符,并且必须遵循标识符的所有 Transact-SQL 规则。 有关详细信息,请参阅 数据库标识符。 文字可以由单引号或双引号分隔。 如果文字字符串由双引号分隔,则可以在字符串中包含嵌入式单引号,如省略号。
注意
QUOTED_IDENTIFIER
不会影响括在方括号([
和 ]
)中的分隔标识符。
在创建或更改计算列的索引或索引视图时,SET QUOTED_IDENTIFIER
必须为 ON
。 如果SET QUOTED_IDENTIFIER
为 OFF
,则INSERT
CREATE
UPDATE
为计算列的索引的表或具有索引视图的表,以及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_IDENTIFIER
ON
该提供程序。 这可以在 ODBC 数据源、ODBC 连接特性或 OLE DB 连接属性中进行配置。 默认用于SET QUOTED_IDENTIFIER
OFF
从 DB-Library 应用程序建立的连接。
创建表时,QUOTED IDENTIFIER
即使该选项设置为OFF
创建表时,该选项也始终存储在ON
表的元数据中。
创建存储过程时, SET QUOTED_IDENTIFIER
将捕获设置 SET ANSI_NULLS
并用于该存储过程的后续调用。
在存储过程内执行时,不会更改设置 SET QUOTED_IDENTIFIER
。
ON
QUOTED_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
设置为 ON
和 OFF
时,在字符串表达式中使用单引号和双引号的方式。
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
相关内容
- CREATE DATABASE
- 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
- 数据库标识符