SET QUOTED_IDENTIFIER (Transact-SQL)

 

ESTE TEMA SE APLICA A: síSQL Server (a partir de 2008)síBase de datos SQL de AzuresíAlmacenamiento de datos SQL de Azure síAlmacenamiento de datos paralelos

Hace que SQL Server siga las reglas de ISO en cuanto a comillas delimitadoras de identificadores y cadenas literales se refiere. Los identificadores delimitados con comillas dobles pueden ser palabras clave reservadas de Transact-SQL o pueden contener caracteres normalmente no admitidos por las reglas sintácticas para identificadores de Transact-SQL.

Topic link icon Convenciones de sintaxis de Transact-SQL

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

Cuando SET QUOTED_IDENTIFIER es ON, los identificadores pueden delimitarse con comillas dobles y los literales deben delimitarse con comillas simples. Cuando SET QUOTED_IDENTIFIER es OFF, los identificadores no pueden entrecomillarse y deben seguir todas las reglas para identificadores de Transact-SQL. Para obtener más información, vea Database Identifiers. Los literales se pueden delimitar con comillas simples o dobles.

Cuando SET QUOTED_IDENTIFIER es ON (valor predeterminado), todas las cadenas delimitadas con comillas dobles se interpretan como identificadores de objeto. Por ello, los identificadores entrecomillados no tienen que seguir las reglas para identificadores de Transact-SQL. Pueden ser palabras clave reservadas e incluir caracteres que normalmente no se admiten en los identificadores de Transact-SQL. No se pueden utilizar comillas dobles para delimitar expresiones de cadenas literales; para delimitar las cadenas literales se deberán utilizar comillas simples. Si una comilla simple (') forma parte de la cadena literal, se puede representar mediante dos comillas simples ("). SET QUOTED_IDENTIFIER debe ser ON cuando se utilicen palabras reservadas como nombres de objetos de la base de datos.

Cuando SET QUOTED_IDENTIFIER es OFF, las cadenas literales de las expresiones se pueden delimitar con comillas simples o dobles. Si una cadena literal se delimita con comillas dobles, podrá contener comillas simples incrustadas, como, por ejemplo, apóstrofos.

SET QUOTED_IDENTIFIER debe ser ON al crear o cambiar índices en columnas calculadas o vistas indizadas. 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. 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).

SET QUOTED_IDENTIFIER debe ser ON cuando se crea un índice filtrado.

SET QUOTED_IDENTIFIER debe ser ON cuando se invocan métodos del tipo de datos XML.

El SQL Server controlador ODBC Native Client y SQL Server proveedor Native Client OLE DB para SQL Server establecen automáticamente QUOTED_IDENTIFIER en ON al conectarse. 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. El valor predeterminado de SET QUOTED_IDENTIFIER es OFF para las conexiones desde aplicaciones DB-Library.

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.

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.

Cuando se ejecuta dentro de un procedimiento almacenado, la opción SET QUOTED_IDENTIFIER no cambia.

Cuando SET ANSI_DEFAULTS es ON, se habilita SET QUOTED_IDENTIFIER.

SET QUOTED_IDENTIFIER también se corresponde con el valor QUOTED_IDENTIFIER de ALTER DATABASE. Para obtener más información acerca de la configuración de la base de datos, vea 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.

Para un nivel superior "Ad-hoc" análisis por lotes comienza mediante la configuración actual de la sesión 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. 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.
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. SET QUOTED_IDENTIFIER no tiene ningún efecto cuando aparece en el cuerpo de un procedimiento almacenado como SQL estático.

Para un lote anidado mediante sp_executesql o exec() el análisis comienza con la configuración de QUOTED_IDENTIFIER de la sesión. Si el lote anidado está dentro de un procedimiento almacenado, que el análisis inicia con la opción QUOTED_IDENTIFIER del procedimiento almacenado. 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.

Uso de los corchetes [ y ]para delimitar identificadores no se ve afectado por la configuración de QUOTED_IDENTIFIER.

Para ver la configuración actual de este valor, ejecute la consulta siguiente.

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

Debe pertenecer al rol public.

A. Utilizar la opción de identificador entre comillas y nombres de objeto con palabras reservadas

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.

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. Utilizar la opción de identificador entre comillas simples y dobles

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.

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.

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

Crear base de datos (SQL Server Transact-SQL)
CREAR valor predeterminado (Transact-SQL)
CREATE PROCEDURE (Transact-SQL)
Crear regla (Transact-SQL)
Crear tabla (Transact-SQL)
CREAR el DESENCADENADOR (Transact-SQL)
Crear vista (Transact-SQL)
Tipos de datos (Transact-SQL)
EJECUTAR (Transact-SQL)
SELECT (Transact-SQL)
Instrucciones SET (Transact-SQL)
SET ANSI_DEFAULTS (Transact-SQL)
sp_rename (Transact-SQL)

Adiciones de comunidad

AGREGAR
Mostrar: