Partilhar via


SET QUOTED_IDENTIFIER (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Faz com que o SQL Server siga as regras ISO relativas a identificadores que delimitam aspas e strings literais. Identificadores delimitados por aspas duplas podem ser Transact-SQL palavras-chave reservadas ou podem conter caracteres geralmente não permitidos pelas regras da sintaxe Transact-SQL para identificadores.

Transact-SQL convenções de sintaxe

Sintaxe

Sintaxe para SQL Server, Azure SQL Database, pool SQL serverless no Azure Synapse Analytics e Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Sintaxe para o Azure Synapse Analytics e o Parallel Data Warehouse.

SET QUOTED_IDENTIFIER ON

Observações

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 delimitadas por aspas duplas são interpretadas como identificadores de objetos. Identificadores entre aspas não têm de seguir as regras Transact-SQL para identificadores. Podem ser palavras-chave e podem incluir caracteres que não são permitidos nos identificadores Transact-SQL. Se uma aspas dupla (") fizer parte do identificador, pode ser representada por duas aspas duplas (""). SET QUOTED_IDENTIFIER deve ser ON quando são usadas palavras-chave reservadas para nomes de objetos na base de dados.

Quando SET QUOTED_IDENTIFIER é OFF, os identificadores não podem ser citados e devem seguir todas as regras Transact-SQL identificadores. Para obter mais informações, consulte Identificadores de banco de dados. Os literais podem ser delimitados por aspas simples ou duplas. Se uma cadeia literal for delimitada por aspas duplas, a cadeia pode conter aspas simples embutidas, como apóstrofos.

Observação

QUOTED_IDENTIFIER não afeta identificadores delimitados incluídos entre parênteses ([ e ]).

SET QUOTED_IDENTIFIER deve ser ON quando você estiver criando ou alterando índices em colunas computadas ou exibições indexadas. Se SET QUOTED_IDENTIFIER for OFF, então CREATE, UPDATE, INSERT, e DELETE as instruções falham em tabelas com índices em colunas computadas, ou tabelas com vistas indexadas. Para mais informações sobre as definições de opções obrigatórias SET com vistas e índices indexados em colunas computadas, consulte Considerações quando utilizar as instruções SET.

SET QUOTED_IDENTIFIER Deve ser ON quando estás a criar um índice filtrado.

SET QUOTED_IDENTIFIER Deve ser ON quando invocas métodos de tipo de dados XML .

O driver ODBC do SQL Server Native Client e o provedor de base de dados SQL Server Native Client OLE para SQL Server são automaticamente definidos QUOTED_IDENTIFIER para ON quando se ligam. Isto pode ser configurado em fontes de dados ODBC, em atributos de ligação ODBC ou em propriedades de ligação OLE DB. O padrão para SET QUOTED_IDENTIFIER é OFF para ligações de DB-Library aplicações.

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

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

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

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

SET QUOTED_IDENTIFIER corresponde à QUOTED_IDENTIFIER configuração da ALTER DATABASE.

SET QUOTED_IDENTIFIER Tem efeito Transact-SQL tempo de análise e afeta apenas a análise sintática, não a otimização ou execução de consultas.

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 da análise a partir desse momento, e essa definição é guardada para a sessão. Assim, depois de o batch ser analisado e executado, a definição da QUOTED_IDENTIFIER sessão será definida de acordo com a última ocorrência de SET QUOTED_IDENTIFIER no batch.

A Transact-SQL estática num procedimento armazenado é analisada usando a QUOTED_IDENTIFIER definiçã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 sintática 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ça 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 a partir desse ponto, mas a definição da QUOTED_IDENTIFIER sessão não é atualizada.

Para visualizar a definição atual desta definiçã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;

Permissions

Requer adesão à função pública de .

Examples

A. Use a definição de identificador entre aspas e nomes de objetos de palavra reservados

O exemplo seguinte mostra que a SET QUOTED_IDENTIFIER definição deve ser ON, e as palavras-chave nos nomes das tabelas devem estar entre aspas duplas para criar e usar objetos que tenham nomes-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 definição do identificador entre aspas e aspas simples e duplas

O exemplo seguinte mostra a forma como aspas simples e duplas são usadas em expressões de cadeia com SET QUOTED_IDENTIFIER definidos 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

Aqui está 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