SET QUOTED_IDENTIFIER (Transact-SQL)SET QUOTED_IDENTIFIER (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Faz com que o SQL ServerSQL Server siga as regras ISO relativas às aspas que delimitam identificadores e cadeias de caracteres literais.Causes SQL ServerSQL Server to follow the ISO rules regarding quotation mark delimiting identifiers and literal strings. Identificadores delimitados por aspas duplas podem ser palavras-chave reservadas Transact-SQLTransact-SQL ou podem conter caracteres que nem sempre são permitidos pelas regras da sintaxe Transact-SQLTransact-SQL para identificadores.Identifiers delimited by double quotation marks can be either Transact-SQLTransact-SQL reserved keywords or can contain characters not generally allowed by the Transact-SQLTransact-SQL syntax rules for identifiers.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

-- Syntax for SQL Server and Azure SQL Database

SET QUOTED_IDENTIFIER { ON | OFF }
-- Syntax for Azure SQL Data Warehouse and Parallel Data Warehouse

SET QUOTED_IDENTIFIER ON

RemarksRemarks

Quando SET QUOTED_IDENTIFIER está ON, os identificadores podem ser delimitados por aspas duplas e literais devem ser delimitadas por aspas simples.When SET QUOTED_IDENTIFIER is ON, identifiers can be delimited by double quotation marks, and literals must be delimited by single quotation marks. Quando SET QUOTED_IDENTIFIER está OFF, os identificadores não podem estar entre aspas e devem seguir todas as regras Transact-SQLTransact-SQL para identificadores.When SET QUOTED_IDENTIFIER is OFF, identifiers cannot be quoted and must follow all Transact-SQLTransact-SQL rules for identifiers. Para obter mais informações, consulte Database Identifiers.For more information, see Database Identifiers. Literais podem ser delimitados por aspas simples ou duplas.Literals can be delimited by either single or double quotation marks.

Quando SET QUOTED_IDENTIFIER está ON (padrão), todas as cadeias de caracteres delimitadas por aspas duplas são interpretadas como identificadores de objetos.When SET QUOTED_IDENTIFIER is ON (default), all strings delimited by double quotation marks are interpreted as object identifiers. Portanto identificadores entre aspas não precisam seguir as regras Transact-SQLTransact-SQL para identificadores.Therefore, quoted identifiers do not have to follow the Transact-SQLTransact-SQL rules for identifiers. Elas podem ser palavras-chave reservadas e incluir caracteres geralmente não permitidos nos identificadores Transact-SQLTransact-SQL.They can be reserved keywords and can include characters not generally allowed in Transact-SQLTransact-SQL identifiers. 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.Double quotation marks cannot be used to delimit literal string expressions; single quotation marks must be used to enclose literal strings. Se um sinal de aspas simples ( ' ) fizer parte da cadeia de caracteres literal, ele poderá ser representado por duas aspas simples ( '' ).If a single quotation mark (') is part of the literal string, it can be represented by two single quotation marks ("). SET QUOTED_IDENTIFIER deve estar ON quando palavras-chave reservadas são usadas para nomes de objetos do banco de dados.SET QUOTED_IDENTIFIER must be ON when reserved keywords are used for object names in the database.

Quando SET QUOTED_IDENTIFIER está OFF, cadeias de caracteres literais em expressões podem ser delimitadas por aspas simples ou duplas.When SET QUOTED_IDENTIFIER is OFF, literal strings in expressions can be delimited by single or double quotation marks. Se uma cadeia de caracteres literal estiver delimitada por aspas duplas, a cadeia de caracteres poderá conter aspas simples inseridas, como apóstrofos.If a literal string is delimited by double quotation marks, the string can contain embedded single quotation marks, such as apostrophes.

SET QUOTED_IDENTIFIER deve estar ON quando você está criando ou alterando índices em colunas computadas ou exibições indexadas.SET QUOTED_IDENTIFIER must be ON when you are creating or changing indexes on computed columns or indexed views. 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.If SET QUOTED_IDENTIFIER is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. Para obter mais informações sobre as configurações exigidas da opção SET com exibições indexadas e índices em colunas computadas, consulte "Considerações sobre o uso das instruções SET" em Instruções SET.For more information about required SET option settings with indexed views and indexes on computed columns, see "Considerations When You Use the SET Statements" in SET Statements.

SET QUOTED_IDENTIFIER deverá estar definido como ON quando você estiver criando um índice filtrado.SET QUOTED_IDENTIFIER must be ON when you are creating a filtered index.

SET QUOTED_IDENTIFIER deverá estar definido como ON quando você invocar métodos de tipo de dados XML.SET QUOTED_IDENTIFIER must be ON when you invoke XML data type methods.

O driver ODBC do SQL ServerSQL Server Native Client e o Provedor OLE DB do SQL ServerSQL Server Native Client para SQL ServerSQL Server definem QUOTED_IDENTIFIER automaticamente como ON durante a conexão.The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set QUOTED_IDENTIFIER to ON when connecting. Isso pode ser configurado em fontes de dados ODBC, em atributos de conexão ODBC ou em propriedades de conexão OLE DB.This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. O padrão para SET QUOTED_IDENTIFIER é OFF para conexões de aplicativos DB-Library.The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.

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.When a table is created, the QUOTED IDENTIFIER option is always stored as ON in the table's metadata even if the option is set to OFF when the table is created.

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.When a stored procedure is created, the SET QUOTED_IDENTIFIER and SET ANSI_NULLS settings are captured and used for subsequent invocations of that stored procedure.

Quando executada dentro de um procedimento armazenado, a configuração de SET QUOTED_IDENTIFIER não é alterada.When executed inside a stored procedure, the setting of SET QUOTED_IDENTIFIER is not changed.

Quando SET ANSI_DEFAULTS está ON, SET QUOTED_IDENTIFIER está habilitado.When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.

SET QUOTED_IDENTIFIER também corresponde à configuração QUOTED_IDENTIFIER de ALTER DATABASE.SET QUOTED_IDENTIFIER also corresponds to the QUOTED_IDENTIFIER setting of ALTER DATABASE. Para obter mais informações sobre as configurações de banco de dados, consulte ALTER DATABASE.For more information about database settings, see ALTER DATABASE.

SET QUOTED_IDENTIFIER entra em vigor no momento da análise e afeta apenas a análise, não a execução da consulta.SET QUOTED_IDENTIFIER takes effect at parse-time and only affects parsing, not query execution.

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.For a top-level ad-hoc batch parsing begins using the session's current setting for QUOTED_IDENTIFIER. Conforme o lote é 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.As the batch is parsed any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, and save that setting for the session. Portanto depois que o lote for analisado e executado, a configuração QUOTED_IDENTIFER da sessão será definida de acordo com a última ocorrência de SET QUOTED_IDENTIFIER no lote.So after the batch is parsed and executed, the session's QUOTED_IDENTIFER setting will be set according to the last occurrence of SET QUOTED_IDENTIFIER in the batch.

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.Static SQL in a stored procedure is parsed using the QUOTED_IDENTIFIER setting in effect for the batch that created or altered the stored procedure. SET QUOTED_IDENTIFIER não tem efeito quando aparece no corpo de um procedimento armazenado como SQL estático.SET QUOTED_IDENTIFIER has no effect when it appears in the body of a stored procedure as static SQL.

Para um lote aninhado usando sp_executesql ou EXEC(), a análise inicia usando a configuração de QUOTED_IDENTIFIER da sessão.For a nested batch using sp_executesql or exec() the parsing begins using the QUOTED_IDENTIFIER setting of the session. Se o lote aninhado dentro de um procedimento armazenado a análise começará a usar a configuração QUOTED_IDENTIFIER do procedimento armazenado.If the nested batch is inside a stored procedure the parsing starts using the QUOTED_IDENTIFIER setting of the stored procedure. Conforme o lote aninhado é 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.As the nested batch is parsed, any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, but the session's QUOTED_IDENTIFIER setting will not be updated.

O uso de colchetes, [ e ] , para delimitar identificadores não é afetado pela configuração QUOTED_IDENTIFIER.Using brackets, [ and ], to delimit identifiers is not affected by the QUOTED_IDENTIFIER setting.

Para exibir a configuração atual dessa configuração, execute a consulta a seguir.To view the current setting for this setting, run the following query.

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

PermissõesPermissions

Requer associação à função public.Requires membership in the public role.

ExemplosExamples

A.A. Usando uma configuração de identificador entre aspas e nomes de objetos de palavra reservadaUsing the quoted identifier setting and reserved word object names

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.The following example shows that the SET QUOTED_IDENTIFIER setting must be ON, and the keywords in table names must be in double quotation marks to create and use objects that have reserved keyword names.

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.B. Usando uma configuração de identificador entre aspas simples e duplasUsing the quoted identifier setting with single and double quotation marks

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.The following example shows the way single and double quotation marks are used in string expressions with SET QUOTED_IDENTIFIER set to ON and OFF.

SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2012;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME = 'Test')
    DROP TABLE dbo.Test;
GO
USE AdventureWorks2012;
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.Here is the result set.

 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émSee Also