SET QUOTED_IDENTIFIER (Transact-SQL)

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.

Ícone de vínculo de tópicoConvenções de sintaxe Transact-SQL

Sintaxe

SET QUOTED_IDENTIFIER { ON | OFF }

Comentários

Quando SET QUOTED_IDENTIFIER está ON, os identificadores podem ser delimitados por aspas duplas e literais devem ser delimitadas por aspas simples. Quando SET QUOTED_IDENTIFIER está OFF, os identificadores não podem estar entre aspas e devem seguir todas as regras Transact-SQL para identificadores. Para obter mais informações, consulte Identificadores. Literais podem ser delimitados por aspas simples ou duplas.

Quando SET QUOTED_IDENTIFIER está ON (padrão), todas as cadeias de caracteres delimitadas por aspas duplas são interpretadas como identificadores de objetos. Portanto identificadores entre aspas não precisam seguir as regras Transact-SQL para identificadores. Elas 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 aspas simples (') fizerem parte da cadeia de caracteres literal, elas poderão ser representadas por duas aspas duplas ("). SET QUOTED_IDENTIFIER deve estar ON quando palavras-chave reservadas são usadas para nomes de objetos do banco de dados.

Quando SET QUOTED_IDENTIFIER está OFF, cadeias de caracteres literais em expressões podem ser delimitadas por aspas simples ou duplas. Se uma cadeia de caracteres literal estiver delimitada por aspas duplas, a cadeia de caracteres poderá conter aspas simples incorporadas, como apóstrofos.

SET QUOTED_IDENTIFIER deve estar ON quando você está criando ou alterando índices em colunas computadas ou exibições indexadas. Se SET QUOTED_IDENTIFIER estiver OFF, as instruções CREATE, UPDATE, INSERT e DELETE em tabelas com índices em colunas computadas ou exibições indexadas falharão. Para obter mais informações sobre as configurações da opção SET com exibições e índices indexados em colunas computadas, consulte "Considerações sobre o uso das instruções SET" em SET (Transact-SQL).

O driver ODBC do SQL Server Native Client e o OLE DB Provider for SQL Server do SQL Server Native Client definem automaticamente QUOTED_IDENTIFIER como ON ao 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 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 está ON, SET QUOTED_IDENTIFIER está habilitado.

SET QUOTED_IDENTIFIER também corresponde à configuração QUOTED_IDENTIFER de ALTER DATABASE. Para obter mais informações sobre configurações do banco de dados, consulte ALTER DATABASE (Transact-SQL) e Definindo opções do banco de dados.

SET QUOTED_IDENTIFIER é definido na hora da análise. A configuração no momento da análise significa que se a instrução SET estiver presente no lote ou no procedimento armazenado, ela terá efeito, independentemente de se a execução do código realmente atinge esse ponto; e a instrução SET tem efeito antes de qualquer instrução ser executada.

O uso de colchetes, [ e ], para delimitar identificadores não é afetado pela configuração de QUOTED_IDENTIFIER.

Permissões

Exige 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
-- An attempt to create a table with a reserved keyword as a name
-- should fail.
CREATE TABLE "select" ("identity" INT IDENTITY NOT NULL, "order" INT NOT NULL);
GO

SET QUOTED_IDENTIFIER ON;
GO

-- Will succeed.
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 AdventureWorks2008R2;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test;
GO
USE AdventureWorks2008R2;
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