Compartilhar via


SET QUOTED_IDENTIFIER (Transact-SQL)

Applies to:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL analytics no Microsoft FabricWarehouse no banco de dados Microsoft FabricSQL em Microsoft Fabric

A configuração QUOTED_IDENTIFIER faz com que SQL Server sigam as regras ISO para aspas delimindo identificadores e cadeias de caracteres literais. Se você usar aspas duplas para delimitar identificadores, poderá usar Transact-SQL palavras-chave reservadas ou incluir caracteres que as regras de sintaxe Transact-SQL geralmente não permitem em identificadores.

Transact-SQL convenções de sintaxe

Sintaxe

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

SET QUOTED_IDENTIFIER { ON | OFF }

Sintaxe para Azure Synapse Analytics e Data Warehouse Paralela.

SET QUOTED_IDENTIFIER ON

Comentários

Ao definir SET QUOTED_IDENTIFIER como ON (o padrão), você pode usar aspas duplas ("") para delimitar identificadores e deve usar aspas simples ('') para delimitar literais. Todas as cadeias de caracteres entre aspas duplas são interpretadas como identificadores de objeto. Os identificadores entre aspas não precisam seguir as regras de Transact-SQL para identificadores. Elas podem ser palavras-chave e podem incluir caracteres que não são permitidos em identificadores Transact-SQL. Se uma aspa dupla (") fizer parte do identificador, você poderá representá-la por duas aspas duplas (""). Você deve definir SET QUOTED_IDENTIFIER quando ON usar palavras-chave reservadas para nomes de objeto no banco de dados.

Quando você define SET QUOTED_IDENTIFIER como OFF, não é possível citar identificadores e eles devem seguir todas as regras de Transact-SQL para identificadores. Para obter mais informações, consulte Identificadores de banco de dados. Você pode delimitar literais por aspas simples ou duplas. Se você delimitar uma cadeia de caracteres literal 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 ]).

Você deve definir SET QUOTED_IDENTIFIER quando ON criar ou alterar índices em colunas computadas ou exibições indexadas. Se você definir SET QUOTED_IDENTIFIER como OFF, CREATE, UPDATE, INSERTe DELETE instruções falharem 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.

Você deve definir SET QUOTED_IDENTIFIER quando ON criar um índice filtrado.

Você deve definir SET QUOTED_IDENTIFIER quando ON invocar métodos de tipo de dados xml .

O driver ODBC do SQL Server Native Client e o provedor OLE DB do cliente nativo SQL Server para SQL Server automaticamente definir QUOTED_IDENTIFIER como ON ao se conectar. Você pode definir essa configuração em fontes de dados ODBC, em atributos de conexão ODBC ou 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 você cria uma tabela, os metadados da tabela sempre armazenam a opção QUOTED_IDENTIFIER como ON se você definisse a opção ao OFF criar a tabela.

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

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

Quando você define SET ANSI_DEFAULTS como ON, QUOTED_IDENTIFIER também é definido como ON.

SET QUOTED_IDENTIFIERcorresponde à QUOTED_IDENTIFIER configuração de ALTER DATABASE.

SET QUOTED_IDENTIFIER entra em vigor em Transact-SQL tempo de análise e afeta apenas a análise, não a otimização de consulta ou 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 de SET QUOTED_IDENTIFIER altera o comportamento de análise desse ponto em diante e salva essa configuração para a sessão. Portanto, depois que o lote é analisado e executado, a configuração da QUOTED_IDENTIFIER sessão é definida de acordo com a última ocorrência do SET QUOTED_IDENTIFIER lote.

A Transact-SQL estática em um procedimento armazenado é analisada 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 começa a usar 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 AS VARCHAR (3) = 'OFF';

IF ((256 & @@OPTIONS) = 256)
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Permissões

Requer associação na função de banco de dados fixa 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 SET QUOTED_IDENTIFIER configuração deve ser ON, e as palavras-chave em nomes de tabela devem estar entre aspas duplas para criar e usar objetos com nomes de palavra-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 como aspas simples e duplas são usadas em expressões de cadeia de caracteres com SET QUOTED_IDENTIFIER set to ON e OFF.

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

Veja a seguir 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