SET QUOTED_IDENTIFIER (Transact-SQL)

Si applica a: SQL Server Database SQL di Azure Istanza gestita di SQL di Azure Azure Synapse Analytics Piattaforma di strumenti analitici (PDW) Endpoint di analisi SQL in Microsoft Fabric Warehouse 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

Sintassi per SQL Server, database SQL di Azure, pool SQL serverless in Azure Synapse Analytics e Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Sintassi per Azure Synapse Analytics e Parallel Data Warehouse.

SET QUOTED_IDENTIFIER ON

Osservazioni:

Quando SET QUOTED_IDENTIFIER è ON (impostazione predefinita), gli identificatori possono essere delimitati da virgolette doppie ("") e i valori letterali devono essere delimitati da virgolette singole (''). Tutte le stringhe delimitate da virgolette doppie vengono interpretate come identificatori di oggetto. Gli identificatori delimitati non devono necessariamente essere conformi alle regole di Transact-SQL per gli identificatori. Possono essere parole chiave e includere caratteri normalmente non consentiti negli identificatori di Transact-SQL. Se una virgoletta doppia (") fa parte dell'identificatore, può essere rappresentata da due virgolette doppie (""). SET QUOTED_IDENTIFIER deve essere ON quando le parole chiave riservate vengono utilizzate per i nomi degli oggetti nel database.

Quando SET QUOTED_IDENTIFIER è OFF, gli identificatori non possono essere racchiusi tra virgolette e devono seguire tutte le regole Transact-SQL per gli identificatori. Per altre informazioni, vedere Identificatori di 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 ([ e ]).

È 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 SET QUOTED_IDENTIFIER è OFF, CREATEle istruzioni , INSERTUPDATE, e DELETE hanno esito negativo nelle tabelle con indici su colonne calcolate o tabelle con viste indicizzate. Per altre informazioni sulle impostazioni delle opzioni necessarie SET con viste indicizzate e indici nelle colonne calcolate, vedere Considerazioni quando si usano le 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 vengono impostati QUOTED_IDENTIFIER ON automaticamente su durante la 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 per SET QUOTED_IDENTIFIER è OFF per le connessioni dalle applicazioni della libreria di database.

Quando viene creata una tabella, l'opzione QUOTED IDENTIFIER viene sempre archiviata come ON nei metadati della tabella anche se l'opzione è impostata OFF su quando viene creata la tabella.

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

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

Quando SET ANSI_DEFAULTS è ON, QUOTED_IDENTIFIER è anche ON.

SET QUOTED_IDENTIFIER corrisponde 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 batch ad hoc di primo livello, l'analisi inizia usando l'impostazione corrente della sessione per QUOTED_IDENTIFIER. Quando il batch viene analizzato qualsiasi occorrenza di modifica del comportamento di SET QUOTED_IDENTIFIER analisi da quel punto in poi e salva tale impostazione per la sessione. Quindi, dopo l'analisi e l'esecuzione del batch, l'impostazione della QUOTED_IDENTIFIER sessione verrà impostata in base all'ultima occorrenza di SET QUOTED_IDENTIFIER nel batch.

Transact-SQL statico in una stored procedure viene analizzato usando l'impostazione QUOTED_IDENTIFIER attiva 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 tramite sp_executesql o exec(), l'analisi inizia usando l'impostazione QUOTED_IDENTIFIER della sessione. Se il batch annidato si trova all'interno di una stored procedure, l'analisi inizia a usare l'impostazione QUOTED_IDENTIFIER della stored procedure. Man mano che il batch annidato viene analizzato, qualsiasi occorrenza di modifica il comportamento di SET QUOTED_IDENTIFIER analisi da quel punto in poi, ma l'impostazione della QUOTED_IDENTIFIER sessione non viene 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

È richiesta l'appartenenza al ruolo public .

Esempi

R. Usare l'impostazione dell'identificatore tra virgolette e i nomi degli oggetti parola riservati

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. Usare l'impostazione dell'identificatore tra 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;
GO

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

Il set di risultati è il seguente.

 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