SET QUOTED_IDENTIFIER (Transact-SQL)

Si applica a:SQL ServerDatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsPiattaforma di strumenti analitici (PDW)Endpoint di analisi SQL in Microsoft FabricWarehouse in Microsoft Fabric

Impone in SQL Server la conformità alle regole ISO relative all'utilizzo delle virgolette per delimitare identificatori e stringhe letterali. Gli identificatori delimitati da virgolette doppie possono essere parole chiave riservate di Transact-SQL e possono includere caratteri in genere non consentiti in base alle regole di sintassi per gli identificatori di Transact-SQL.

Convenzioni relative alla sintassi Transact-SQL

Sintassi

-- Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics, and Microsoft Fabric

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

SET QUOTED_IDENTIFIER ON

Nota

Per visualizzare la sintassi Transact-SQL per SQL Server 2014 (12.x) e versioni precedenti, vedere la documentazione delle versioni precedenti.

Osservazioni:

Quando SET QUOTED_IDENTIFIER è ON (impostazione predefinita), gli identificatori possono essere racchiusi tra virgolette doppie (" "), mentre i valori letterali devono essere racchiusi tra virgolette singole (' '). Tutte le stringhe delimitate da virgolette doppie vengono interpretate come identificatori di oggetto. Gli identificatori delimitati pertanto non devono necessariamente essere conformi alle regole per gli identificatori di Transact-SQL. Possono essere parole chiave riservate e includere caratteri normalmente non consentiti negli identificatori di Transact-SQL. Non è possibile utilizzare le virgolette doppie per delimitare espressioni di stringhe letterali. Inoltre le stringhe letterali devono essere racchiuse tra virgolette singole. Se la stringa letterale contiene una virgoletta singola ('), questa può essere rappresentata da due virgolette singole (''). Quando si usano parole chiave riservate per nomi di oggetti nel database, è necessario che l'opzione SET QUOTED_IDENTIFIER sia impostata su ON.

Quando l'opzione SET QUOTED_IDENTIFIER è impostata su OFF, non è possibile racchiudere tra virgolette gli identificatori, i quali devono essere conformi a tutte le regole per gli identificatori di Transact-SQL. Per altre informazioni, vedere Identificatori del database. È possibile delimitare i valori letterali con virgolette singole o doppie. Se una stringa letterale è delimitata da virgolette doppie, la stringa può includere virgolette singole, ad esempio gli apostrofi.

Nota

QUOTED_IDENTIFIER non influisce sugli identificatori delimitati racchiusi tra parentesi quadre ([ ]).

È necessario che l'opzione SET QUOTED_IDENTIFIER sia impostata su ON durante la creazione o la modifica di indici in colonne calcolate o viste indicizzate. Se l'opzione SET QUOTED_IDENTIFIER è impostata su OFF, le istruzioni CREATE, UPDATE, INSERT e DELETE eseguite su tabelle con indici in colonne calcolate o con viste indicizzate hanno esito negativo. Per altre informazioni sulle impostazioni dell'opzione SET necessarie per viste indicizzate e indici in colonne calcolate, vedere Considerazioni sull'uso delle istruzioni SET.

SET QUOTED_IDENTIFIER deve essere ON quando si crea un indice filtrato.

SET QUOTED_IDENTIFIER deve essere ON quando si richiamano metodi con tipo di dati XML.

Il driver ODBC di SQL Server Native Client e il provider OLE DB di SQL Server Native Client per SQL Server impostano automaticamente l'opzione QUOTED_IDENTIFIER su ON al momento della connessione. È possibile configurare questa impostazione nelle origini dei dati ODBC, negli attributi di connessione ODBC o nelle proprietà di connessione OLE DB. L'impostazione predefinita dell'opzione SET QUOTED_IDENTIFIER è OFF per le connessioni dalle applicazioni DB-Library.

Durante la creazione di una tabella l'opzione QUOTED IDENTIFIER viene sempre archiviata impostata su ON nei metadati della tabella se l'opzione è stata precedentemente impostata su OFF.

Quando viene creata una stored procedure, le impostazioni delle opzioni SET QUOTED_IDENTIFIER e SET ANSI_NULLS vengono acquisite e utilizzate per le successive chiamate della stored procedure.

Quando viene eseguita all'interno di una stored procedure, l'impostazione dell'opzione SET QUOTED_IDENTIFIER non viene modificata.

Quando SET ANSI_DEFAULTS è ON, anche QUOTED_IDENTIFIER è ON.

SET QUOTED_IDENTIFIER corrisponde anche all'impostazione QUOTED_IDENTIFIER di ALTER DATABASE.

SET QUOTED_IDENTIFIER diventa effettiva in fase di analisi di Transact-SQL e influisce solo sull'analisi, non sull'ottimizzazione o l'esecuzione delle query.

Per un'analisi batch ad hoc di primo livello inizia a usare l'impostazione corrente della sessione per QUOTED_IDENTIFIER. Durante l'analisi del batch, le occorrenze di SET QUOTED_IDENTIFIER modificheranno il comportamento di analisi da quel punto in poi e questa impostazione verrà salvata per la sessione. Quindi, dopo l'analisi e l'esecuzione del batch, l'impostazione QUOTED_IDENTIFIER della sessione verrà impostata in base all'ultima occorrenza di SET QUOTED_IDENTIFIER nel batch.

Le istruzioni di Transact-SQL statiche in una stored procedure vengono analizzate usando l'impostazione QUOTED_IDENTIFIER in uso per il batch che ha creato o modificato la stored procedure. SET QUOTED_IDENTIFIER non produce alcun effetto quando si trova nel corpo di una stored procedure come istruzione di Transact-SQL statica.

Per un batch annidato che usa sp_executesql o exec() l'analisi viene avviata tramite l'impostazione QUOTED_IDENTIFIER della sessione. Se il batch annidato si trova all'interno di una stored procedure, l'analisi viene avviata tramite l'impostazione QUOTED_IDENTIFIER della stored procedure. Durante l'analisi del batch annidato, le occorrenze di SET QUOTED_IDENTIFIER modificheranno il comportamento di analisi da quel punto in poi, ma l'impostazione QUOTED_IDENTIFIER della sessione non verrà aggiornata.

Per visualizzare l'impostazione corrente per questa impostazione, eseguire la query riportata di seguito:

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

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Autorizzazioni

Richiede l'appartenenza al ruolo PUBLIC.

Esempi

R. Utilizzo dell'impostazione per l'identificatore delimitato e di nomi di oggetto corrispondenti a parole chiave riservate

Nell'esempio seguente viene illustrato come, per poter creare e utilizzare oggetti con nomi che corrispondono a parole chiave riservate, sia necessario impostare l'opzione SET QUOTED_IDENTIFIER su ON e racchiudere tra virgolette doppie le parole chiave nei nomi di tabella.

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. Utilizzo dell'opzione per l'identificatore delimitato con virgolette singole e doppie

Nell'esempio seguente viene illustrato l'utilizzo di virgolette singole e doppie in espressioni stringa con l'opzione SET QUOTED_IDENTIFIER impostata su ON e OFF.

SET QUOTED_IDENTIFIER OFF;
GO

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

Questo è il set di risultati.

 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

Vedi anche

CREATE DATABASE
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
Tipi di dati
EXECUTE
SELECT
Istruzioni SET
SET ANSI_DEFAULTS
sp_rename
Identificatori del database