SET QUOTED_IDENTIFIER (Transact-SQL)

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)Ponto de extremidade de SQL no Microsoft FabricWarehouse no Microsoft Fabric

Faz com que o SQL Server siga as regras ISO relativas às aspas que delimitam identificadores e cadeias de caracteres literais. Identificadores delimitados por aspas duplas podem ser palavras-chave reservadas Transact-SQL ou podem conter caracteres que nem sempre são permitidos pelas regras da sintaxe Transact-SQL para identificadores.

Convenções de sintaxe de Transact-SQL

Sintaxe

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

Observação

Para exibir a sintaxe do Transact-SQL para o SQL Server 2014 (12.x) e versões anteriores, confira a Documentação das versões anteriores.

Comentários

Quando SET QUOTED_IDENTIFIER for ON (padrão), os identificadores podem ser delimitados por aspas duplas (" "), e os literais precisam ser delimitados por aspas simples (' '). Todas as cadeias de caracteres delimitadas por aspas duplas são interpretadas como identificadores de objeto. Portanto, identificadores entre aspas não precisam seguir as regras Transact-SQL para identificadores. Eles podem ser palavras-chave reservadas e incluir caracteres geralmente não permitidos nos identificadores Transact-SQL. Aspas duplas não podem ser usadas para delimitar expressões de cadeias de caracteres literais. Aspas simples devem ser usadas para delimitar cadeias de caracteres literais. Se um sinal de aspas simples (') fizer parte da cadeia de caracteres literal, ele poderá ser representado por duas aspas simples (''). SET QUOTED_IDENTIFIER precisará ser ON quando palavras-chave reservadas forem usadas para nomes de objetos no banco de dados.

Quando SET QUOTED_IDENTIFIER for OFF, os identificadores não poderão estar entre aspas e precisarão seguir todas as regras Transact-SQL para identificadores. Para obter mais informações, consulte Database Identifiers. Literais podem ser delimitados por aspas simples ou duplas. Se uma cadeia de caracteres literal estiver delimitada por aspas duplas, a cadeia de caracteres poderá conter aspas simples inseridas, como apóstrofos.

Observação

QUOTED_IDENTIFIER não afeta os identificadores delimitados entre colchetes ([ ]).

SET QUOTED_IDENTIFIER precisará ser ON ao criar ou alterar índices em colunas computadas ou exibições indexadas. Se SET QUOTED_IDENTIFIER for OFF, as instruções CREATE, UPDATE, INSERT e DELETE falharão nas tabelas com índices em colunas computadas ou nas tabelas com exibições indexadas. Para obter mais informações sobre as configurações da opção SET necessárias com exibições indexadas e índices em colunas computadas, confira Considerações sobre o uso das instruções SET.

SET QUOTED_IDENTIFIER precisará ser ON quando você estiver criando um índice filtrado.

SET QUOTED_IDENTIFIER precisará ser ON quando você invocar métodos de tipo de dados XML.

O driver ODBC do SQL Server Native Client e o Provedor OLE DB do SQL Server Native Client para SQL Server definem QUOTED_IDENTIFIER automaticamente como ON durante a conexão. Isso pode ser configurado em fontes de dados ODBC, em atributos de conexão ODBC ou em propriedades de conexão OLE DB. O padrão para SET QUOTED_IDENTIFIER é OFF para conexões de aplicativos DB-Library.

Quando uma tabela é criada, a opção QUOTED IDENTIFIER sempre é armazenada como ON nos metadados da tabela mesmo que a opção esteja definida como OFF quando a tabela é criada.

Quando um procedimento armazenado é criado, as configurações SET QUOTED_IDENTIFIER e SET ANSI_NULLS são capturadas e usadas para invocações subsequentes desse procedimento armazenado.

Quando executada dentro de um procedimento armazenado, a configuração de SET QUOTED_IDENTIFIER não é alterada.

Quando SET ANSI_DEFAULTS for ON, o QUOTED_IDENTIFIER também será ON.

SET QUOTED_IDENTIFIER também corresponde à configuração QUOTED_IDENTIFIER de ALTER DATABASE.

SET QUOTED_IDENTIFIER entra em vigor no momento da análise Transact-SQL e afeta apenas a análise, não a otimização de consulta nem a execução da consulta.

Para um lote ad hoc de nível superior, a análise começa usando a configuração atual da sessão para QUOTED_IDENTIFIER. Conforme o lote for analisado, qualquer ocorrência de SET QUOTED_IDENTIFIER mudará o comportamento de análise desse ponto em diante e salvará essa configuração para a sessão. Assim, depois que o lote for analisado e executado, a configuração de QUOTED_IDENTIFIER da sessão será definida de acordo com a última ocorrência de SET QUOTED_IDENTIFIER no lote.

O Transact-SQL estático em um procedimento armazenado é analisado usando a configuração QUOTED_IDENTIFIER em vigor para o lote que criou ou alterou o procedimento armazenado. SET QUOTED_IDENTIFIER não tem efeito quando aparece no corpo de um procedimento armazenado como Transact-SQL estático.

Para um lote aninhado que usa sp_executesql ou exec(), a análise é iniciada com a configuração QUOTED_IDENTIFIER da sessão. Se o lote aninhado estiver em um procedimento armazenado, a análise será iniciada com a configuração QUOTED_IDENTIFIER do procedimento armazenado. Conforme o lote aninhado for analisado, qualquer ocorrência de SET QUOTED_IDENTIFIER mudará o comportamento de análise desse ponto em diante, mas a configuração QUOTED_IDENTIFIER da sessão não será atualizada.

Para exibir a configuração atual dessa configuração, execute a seguinte consulta:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 ) 
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Permissões

Exige a associação à função PUBLIC.

Exemplos

a. Usando uma configuração de identificador entre aspas e nomes de objetos de palavra reservada

O exemplo a seguir mostra que a configuração de SET QUOTED_IDENTIFIER deve estar ON, e as palavras-chave em nomes de tabelas devem estar entre aspas duplas para criar e usar objetos que têm nomes de palavras-chave reservados.

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. Usando uma configuração de identificador entre aspas simples e duplas

O exemplo a seguir mostra a maneira como aspas simples e duplas são usadas em expressões de cadeias de caracteres com SET QUOTED_IDENTIFIER dedinido como ON e 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

Este é o conjunto de resultados.

 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

Consulte Também

CREATE DATABASE
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
Data Types
EXECUTE
SELECT
Instruções SET
SET ANSI_DEFAULTS
sp_rename
Identificadores de banco de dados