SET QUOTED_IDENTIFIER (Transact-SQL)

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse 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

Sintaxe para SQL Server, Banco de Dados SQL do Azure, pool de SQL sem servidor no Azure Synapse Analytics e Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Sintaxe para Azure Synapse Analytics e 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 é ON (padrão), os identificadores podem ser delimitados por aspas duplas ("") e os literais devem ser delimitados por aspas simples (''). Todas as cadeias de caracteres delimitadas por aspas duplas são interpretadas como identificadores de objeto. Os identificadores entre aspas não precisam seguir as regras Transact-SQL para identificadores. Eles podem ser palavras-chave e incluir caracteres não permitidos nos identificadores Transact-SQL. Se uma aspa dupla (") fizer parte do identificador, ela poderá ser representada por duas aspas duplas (""). SET QUOTED_IDENTIFIER deve ser ON quando palavras-chave reservadas são usadas para nomes de objetos no banco de dados.

Quando SET QUOTED_IDENTIFIER é OFF, os identificadores não podem ser citados e devem seguir todas as regras Transact-SQL para identificadores. Para obter mais informações, consulte Identificadores de banco de dados. 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 ([ e ]).

SET QUOTED_IDENTIFIER precisará ser ON ao criar ou alterar índices em colunas computadas ou exibições indexadas. Se SET QUOTED_IDENTIFIER for OFF, então CREATE, , UPDATE, INSERTe DELETE e as instruções falham em tabelas com índices em colunas computadas ou tabelas com exibições indexadas. Para obter mais informações sobre as configurações de opção necessárias SET com exibições indexadas e índices em colunas computadas, consulte Considerações ao usar as instruções SET.

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

SET QUOTED_IDENTIFIER deve ser ON quando você invoca 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 são definidos QUOTED_IDENTIFIER automaticamente ao ON se conectar. 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 for SET QUOTED_IDENTIFIER é OFF para conexões de aplicativos de biblioteca de banco de dados.

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

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

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

Quando SET ANSI_DEFAULTS é ON, QUOTED_IDENTIFIER também ONé .

SET QUOTED_IDENTIFIERcorresponde à QUOTED_IDENTIFIER configuração 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. À medida que o lote é analisado, qualquer ocorrência altera SET QUOTED_IDENTIFIER o comportamento de análise desse ponto em diante e salva essa configuração para a sessão. Assim, depois que o lote for analisado e executado, a configuração da QUOTED_IDENTIFIER 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 QUOTED_IDENTIFIER configuração 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 usando sp_executesql ou exec(), a análise começa usando a QUOTED_IDENTIFIER configuração da sessão. Se o lote aninhado estiver dentro de um procedimento armazenado, a análise começará usando a QUOTED_IDENTIFIER configuração do procedimento armazenado. À medida que o lote aninhado é analisado, qualquer ocorrência de SET QUOTED_IDENTIFIER altera o comportamento de análise desse ponto em diante, mas a configuração da QUOTED_IDENTIFIER sessão não é 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

Requer associação à função pública .

Exemplos

R. Usar a configuração do identificador entre aspas e os nomes de objetos de palavras reservados

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. Use a configuração do 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;
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

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