Compartir a través de


SET QUOTED_IDENTIFIER (Transact-SQL)

Applies to:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics Endpoint in Microsoft FabricWarehouse en Microsoft FabricSQL en Microsoft Fabric

La configuración QUOTED_IDENTIFIER hace que SQL Server siga las reglas ISO para las comillas delimitando identificadores y cadenas literales. Si usa comillas dobles para delimitar identificadores, puede usar Transact-SQL palabras clave reservadas o incluir caracteres que las reglas de sintaxis de Transact-SQL normalmente no permiten en identificadores.

Transact-SQL convenciones de sintaxis

Sintaxis

Sintaxis para SQL Server, Azure SQL Database, grupo de SQL sin servidor en Azure Synapse Analytics y Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Sintaxis para Azure Synapse Analytics y Data Warehouse parallel.

SET QUOTED_IDENTIFIER ON

Comentarios

Cuando se establece SET QUOTED_IDENTIFIER en ON (valor predeterminado), puede usar comillas dobles ("") para delimitar identificadores y debe usar comillas simples ('') para delimitar literales. Todas las cadenas entre comillas dobles se interpretan como identificadores de objeto. Los identificadores entre comillas no necesitan seguir las reglas de Transact-SQL para los identificadores. Pueden ser palabras clave y pueden incluir caracteres que no se permiten en identificadores de Transact-SQL. Si una comilla doble (") forma parte del identificador, puede representarla entre dos comillas dobles (""). Debe establecer en SET QUOTED_IDENTIFIERON cuando use palabras clave reservadas para los nombres de objeto de la base de datos.

Al establecer SET QUOTED_IDENTIFIER en OFF, no se pueden citar los identificadores y deben seguir todas las reglas de Transact-SQL para los identificadores. Para obtener más información, consulte Identificadores de base de datos. Puede delimitar literales entre comillas simples o dobles. Si delimita una cadena literal entre comillas dobles, la cadena puede contener comillas simples incrustadas, como apóstrofos.

Nota:

QUOTED_IDENTIFIER no afecta a los identificadores delimitados entre corchetes ([ y ]).

Debe establecer en SET QUOTED_IDENTIFIERON al crear o cambiar índices en columnas calculadas o vistas indizadas. Si establece SET QUOTED_IDENTIFIEROFFen las instrucciones , CREATE, UPDATE, INSERTy DELETE produce un error en tablas con índices en columnas calculadas o tablas con vistas indizadas. Para obtener más información sobre la configuración de opciones necesaria SET con vistas indizadas e índices en columnas calculadas, consulte Consideraciones al usar las instrucciones SET.

Debe establecer en SET QUOTED_IDENTIFIERON al crear un índice filtrado.

Debe establecer en SET QUOTED_IDENTIFIERON al invocar métodos de tipo de datos xml .

El controlador ODBC de SQL Server Native Client y SQL Server proveedor OLE DB de Native Client para SQL Server establecer automáticamente QUOTED_IDENTIFIER en ON al conectarse. Puede configurar esta opción en orígenes de datos ODBC, en atributos de conexión ODBC o propiedades de conexión OLE DB. El valor predeterminado de SET QUOTED_IDENTIFIER es OFF para las conexiones de las aplicaciones de la biblioteca de bases de datos.

Al crear una tabla, los metadatos de la tabla siempre almacenan la QUOTED_IDENTIFIER opción como ON aunque establezca la opción OFF en al crear la tabla.

Al crear un procedimiento almacenado, la SET QUOTED_IDENTIFIER configuración y SET ANSI_NULLS se capturan y se usan para las invocaciones posteriores de ese procedimiento almacenado.

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

Cuando se establece en SET ANSI_DEFAULTSON, QUOTED_IDENTIFIER también se establece en ON.

SET QUOTED_IDENTIFIER corresponde a la QUOTED_IDENTIFIER configuración de ALTER DATABASE.

SET QUOTED_IDENTIFIER surte efecto en Transact-SQL tiempo de análisis y solo afecta al análisis, no a la optimización de consultas ni a la ejecución de consultas.

Para un lote ad hoc de nivel superior, el análisis comienza a usar la configuración actual de la sesión para QUOTED_IDENTIFIER. A medida que se analiza el lote, cualquier aparición de cambios en SET QUOTED_IDENTIFIER el comportamiento de análisis desde ese punto y guarda esa configuración para la sesión. Por lo tanto, después de analizar y ejecutar el lote, la configuración de QUOTED_IDENTIFIER la sesión se establece según la última aparición del SET QUOTED_IDENTIFIER lote.

Los Transact-SQL estáticos de un procedimiento almacenado se analizan mediante la configuración de QUOTED_IDENTIFIER en vigor para el lote que creó o modificó el procedimiento almacenado. SET QUOTED_IDENTIFIER no tiene ningún efecto cuando aparece en el cuerpo de un procedimiento almacenado como Transact-SQL estático.

Para un lote anidado que usa sp_executesql o exec(), el análisis comienza a usar la QUOTED_IDENTIFIER configuración de la sesión. Si el lote anidado está dentro de un procedimiento almacenado, el análisis comienza a usar la QUOTED_IDENTIFIER configuración del procedimiento almacenado. A medida que se analiza el lote anidado, cualquier aparición de SET QUOTED_IDENTIFIER cambia el comportamiento de análisis desde ese punto, pero la configuración de QUOTED_IDENTIFIER la sesión no se actualiza.

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

DECLARE @QUOTED_IDENTIFIER AS VARCHAR (3) = 'OFF';

IF ((256 & @@OPTIONS) = 256)
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Permisos

Requiere la pertenencia al rol fijo de base de datos público .

Ejemplos

A Usar la configuración del identificador entrecomillado y los nombres de objetos de palabra reservados

En el ejemplo siguiente se muestra que la SET QUOTED_IDENTIFIER configuración debe ser ONy las palabras clave de los nombres de tabla deben estar entre comillas dobles para crear y usar objetos con nombres de palabras clave reservadas.

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. Usar la configuración del identificador entrecomillado con comillas simples y dobles

En el ejemplo siguiente se muestra cómo se usan comillas simples y dobles en expresiones de cadena con SET QUOTED_IDENTIFIER establecido ON en y OFF.

SET QUOTED_IDENTIFIER OFF;
GO

USE AdventureWorks2025;
GO

IF EXISTS (SELECT TABLE_NAME
           FROM INFORMATION_SCHEMA.TABLES
           WHERE TABLE_NAME = 'Test')
    DROP TABLE dbo.Test;
GO

USE AdventureWorks2025;
GO

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

Este es el 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