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

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síAzure SQL DatabasesíAzure SQL Data Warehouse síAlmacenamiento de datos paralelos THIS TOPIC APPLIES TO: yesSQL Server (starting with 2008)yesAzure SQL DatabaseyesAzure SQL Data Warehouse yesParallel Data Warehouse

Hace que SQL ServerSQL Server siga las reglas de ISO en cuanto a comillas delimitadoras de identificadores y cadenas literales se refiere.Causes SQL ServerSQL Server to follow the ISO rules regarding quotation mark delimiting identifiers and literal strings. Los identificadores delimitados con comillas dobles pueden ser palabras clave reservadas de Transact-SQLTransact-SQL o pueden contener caracteres normalmente no admitidos por las reglas sintácticas para identificadores de Transact-SQLTransact-SQL.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.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

-- 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   

ComentariosRemarks

Cuando SET QUOTED_IDENTIFIER es ON, los identificadores pueden delimitarse con comillas dobles y los literales deben delimitarse con comillas simples.When SET QUOTED_IDENTIFIER is ON, identifiers can be delimited by double quotation marks, and literals must be delimited by single quotation marks. Cuando SET QUOTED_IDENTIFIER es OFF, los identificadores no pueden entrecomillarse y deben seguir todas las reglas para identificadores de Transact-SQLTransact-SQL.When SET QUOTED_IDENTIFIER is OFF, identifiers cannot be quoted and must follow all Transact-SQLTransact-SQL rules for identifiers. Para obtener más información, vea Database Identifiers.For more information, see Database Identifiers. Los literales se pueden delimitar con comillas simples o dobles.Literals can be delimited by either single or double quotation marks.

Cuando SET QUOTED_IDENTIFIER es ON (valor predeterminado), todas las cadenas delimitadas con comillas dobles se interpretan como identificadores de objeto.When SET QUOTED_IDENTIFIER is ON (default), all strings delimited by double quotation marks are interpreted as object identifiers. Por ello, los identificadores entrecomillados no tienen que seguir las reglas para identificadores de Transact-SQLTransact-SQL.Therefore, quoted identifiers do not have to follow the Transact-SQLTransact-SQL rules for identifiers. Pueden ser palabras clave reservadas e incluir caracteres que normalmente no se admiten en los identificadores de Transact-SQLTransact-SQL.They can be reserved keywords and can include characters not generally allowed in Transact-SQLTransact-SQL identifiers. No se pueden utilizar comillas dobles para delimitar expresiones de cadenas literales; para delimitar las cadenas literales se deberán utilizar comillas simples.Double quotation marks cannot be used to delimit literal string expressions; single quotation marks must be used to enclose literal strings. Si una comilla simple (') forma parte de la cadena literal, se puede representar mediante dos comillas simples (").If a single quotation mark (') is part of the literal string, it can be represented by two single quotation marks ("). SET QUOTED_IDENTIFIER debe ser ON cuando se utilicen palabras reservadas como nombres de objetos de la base de datos.SET QUOTED_IDENTIFIER must be ON when reserved keywords are used for object names in the database.

Cuando SET QUOTED_IDENTIFIER es OFF, las cadenas literales de las expresiones se pueden delimitar con comillas simples o dobles.When SET QUOTED_IDENTIFIER is OFF, literal strings in expressions can be delimited by single or double quotation marks. Si una cadena literal se delimita con comillas dobles, podrá contener comillas simples incrustadas, como, por ejemplo, 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 debe ser ON al crear o cambiar índices en columnas calculadas o vistas indizadas.SET QUOTED_IDENTIFIER must be ON when you are creating or changing indexes on computed columns or indexed views. Si SET QUOTED_IDENTIFIER es OFF, las instrucciones CREATE, UPDATE, INSERT y DELETE provocarán errores en tablas con índices en columnas calculadas o vistas indizadas.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 obtener más información acerca de las configuraciones de opción de SET requeridas con vistas indizadas e índices en columnas calculadas, vea "Consideraciones cuando se Use las instrucciones SET" en instrucciones SET ( Transact-SQL ) .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 (Transact-SQL).

SET QUOTED_IDENTIFIER debe ser ON cuando se crea un índice filtrado.SET QUOTED_IDENTIFIER must be ON when you are creating a filtered index.

SET QUOTED_IDENTIFIER debe ser ON cuando se invocan métodos del tipo de datos XML.SET QUOTED_IDENTIFIER must be ON when you invoke XML data type methods.

El SQL ServerSQL Server controlador ODBC Native Client y SQL ServerSQL Server proveedor Native Client OLE DB para SQL ServerSQL Server establecen automáticamente QUOTED_IDENTIFIER en ON al conectarse.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. Esta opción se puede configurar en los orígenes de datos ODBC, en los atributos de conexión ODBC o en las propiedades de conexión OLE DB.This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. El valor predeterminado de SET QUOTED_IDENTIFIER es OFF para las conexiones desde aplicaciones DB-Library.The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.

Cuando se crea una tabla, la opción QUOTED IDENTIFIER siempre se almacena como ON en los metadatos de la tabla, aunque se haya establecido en OFF al crear la tabla.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.

Cuando se crea un procedimiento almacenado, los valores de SET QUOTED_IDENTIFIER y SET ANSI_NULLS se capturan y se utilizan en las siguientes llamadas a ese procedimiento almacenado.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.

Cuando se ejecuta dentro de un procedimiento almacenado, la opción SET QUOTED_IDENTIFIER no cambia.When executed inside a stored procedure, the setting of SET QUOTED_IDENTIFIER is not changed.

Cuando SET ANSI_DEFAULTS es ON, se habilita SET QUOTED_IDENTIFIER.When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.

SET QUOTED_IDENTIFIER también se corresponde con el valor QUOTED_IDENTIFIER de ALTER DATABASE.SET QUOTED_IDENTIFIER also corresponds to the QUOTED_IDENTIFIER setting of ALTER DATABASE. Para obtener más información acerca de la configuración de la base de datos, vea ALTER DATABASE ( Transact-SQL ) .For more information about database settings, see ALTER DATABASE (Transact-SQL).

SET QUOTED_IDENTIFIER tiene efecto en tiempo de análisis y sólo afecta a analizar, la ejecución de la consulta no.SET QUOTED_IDENTIFIER is takes effect at parse-time and only affects parsing, not query execution.

Para un nivel superior "Ad-hoc" análisis por lotes comienza mediante la configuración actual de la sesión QUOTED_IDENTIFIER.For a top-level Ad-Hoc batch parsing begins using the session’s current setting for QUOTED_IDENTIFIER. Tal y como se analiza el lote cualquier aparición de SET QUOTED_IDENTIFIER va a cambiar el comportamiento de análisis desde ese punto en y guardar ese valor para la sesión.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. Por lo que cuando se analiza y ejecuta el lote, valor QUOTED_IDENTIFER de la sesión se establecerá según la última aparición de SET QUOTED_IDENTIFIER en el 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 en un procedimiento almacenado se analiza utilizando la configuración de QUOTED_IDENTIFIER en vigor para el lote que se crea o modifica el procedimiento almacenado.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 no tiene ningún efecto cuando aparece en el cuerpo de un procedimiento almacenado como SQL estático.SET QUOTED_IDENTIFIER has no effect when it appears in the body of a stored procedure as static SQL.

Para un lote anidado mediante sp_executesql o exec() el análisis comienza con la configuración de QUOTED_IDENTIFIER de la sesión.For a nested batch using sp_executesql or exec() the parsing begins using the QUOTED_IDENTIFIER setting of the session. Si el lote anidado está dentro de un procedimiento almacenado, que el análisis inicia con la opción QUOTED_IDENTIFIER del procedimiento almacenado.If the nested batch is inside a stored procedure the parsing starts using the QUOTED_IDENTIFIER setting of the stored procedure. Tal y como se analiza el lote anidado la cualquier aparición de SET QUOTED_IDENTIFIER cambiarán el comportamiento de análisis desde ese punto, pero no se actualizará la configuración de QUOTED_IDENTIFIER de la sesión.As the nested batch is parsed the 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.

Uso de los corchetes [ y ]para delimitar identificadores no se ve afectado por la configuración de QUOTED_IDENTIFIER.Using brackets, [ and ], to delimit identifiers is not affected by the QUOTED_IDENTIFIER setting.

Para ver la configuración actual de este valor, ejecute la consulta siguiente.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;  

PermissionsPermissions

Debe pertenecer al rol public.Requires membership in the public role.

EjemplosExamples

A.A. Utilizar la opción de identificador entre comillas y nombres de objeto con palabras reservadasUsing the quoted identifier setting and reserved word object names

En este ejemplo se muestra que, para crear y utilizar objetos cuyos nombres contienen palabras clave reservadas, SET QUOTED_IDENTIFIER debe ser ON y las palabras clave reservadas de los nombres de tabla se deben indicar entre comillas dobles.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. Utilizar la opción de identificador entre comillas simples y doblesUsing the quoted identifier setting with single and double quotation marks

En este ejemplo se muestra el uso de las comillas simples y dobles en las expresiones de cadena con SET QUOTED_IDENTIFIER establecido en ON y 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  

El conjunto de resultados es el siguiente.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

Vea tambiénSee Also

CREATE DATABASE (Transact-SQL de SQL Server) CREATE DATABASE (SQL Server Transact-SQL)
CREATE DEFAULT (Transact-SQL) CREATE DEFAULT (Transact-SQL)
CREATE PROCEDURE (Transact-SQL) CREATE PROCEDURE (Transact-SQL)
CREATE RULE (Transact-SQL) CREATE RULE (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
CREATE TRIGGER (Transact-SQL) CREATE TRIGGER (Transact-SQL)
CREATE VIEW (Transact-SQL) CREATE VIEW (Transact-SQL)
Tipos de datos (Transact-SQL) Data Types (Transact-SQL)
EXECUTE (Transact-SQL) EXECUTE (Transact-SQL)
SELECT (Transact-SQL) SELECT (Transact-SQL)
Instrucciones SET (Transact-SQL) SET Statements (Transact-SQL)
SET ANSI_DEFAULTS ( Transact-SQL ) SET ANSI_DEFAULTS (Transact-SQL)
sp_rename ( Transact-SQL )sp_rename (Transact-SQL)