SET QUOTED_IDENTIFIER (Transact-SQL)

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

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQL

Sintassi

SET QUOTED_IDENTIFIER { ON | OFF }

Osservazioni

Quando l'opzione SET QUOTED_IDENTIFIER è impostata su ON, è possibile delimitare gli identificatori con virgolette doppie, mentre i valori letterali devono essere delimitati da virgolette singole. Quando l'opzione SET QUOTED_IDENTIFIER è impostata su OFF, non è possibile racchiudere tra virgolette gli identificatori, i quali devono essere conformi alle regole per gli identificatori di Transact-SQL. Per ulteriori informazioni, vedere Identificatori. È possibile delimitare i valori letterali con virgolette singole o doppie.

Quando l'opzione SET QUOTED_IDENTIFIER è impostata su ON (impostazione predefinita), tutte le stringhe delimitate da virgolette doppie vengono interpretate come identificatori di oggetto. Gli identificatori tra virgolette 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 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 una virgoletta singola (') è un carattere di una stringa letterale, è possibile rappresentarla con due virgolette singole ("). Quando si utilizzano 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, è possibile delimitare le stringhe letterali nelle espressioni con virgolette singole o doppie. Se una stringa letterale è delimitata da virgolette doppie, la stringa può includere virgolette singole, ad esempio gli apostrofi.

È 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 che includono indici in colonne calcolate o viste indicizzate hanno esito negativo. Per ulteriori informazioni sulle impostazioni dell'opzione SET necessarie per viste indicizzate e indici nelle colonne calcolate, vedere "Considerazioni sull'utilizzo delle istruzioni SET" nell'argomento SET (Transact-SQL).

Il driver ODBC di SQL Server Native Client e il provider OLE DB per SQL Server Native Client per SQL Server impostano automaticamente l'opzione QUOTED_IDENTIFIER su ON 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 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 l'opzione SET ANSI_DEFAULTS è impostata su ON, l'opzione SET QUOTED_IDENTIFIER risulta abilitata.

SET QUOTED_IDENTIFIER corrisponde inoltre all'opzione QUOTED_IDENTIFER di ALTER DATABASE. Per ulteriori informazioni sulle impostazioni del database, vedere ALTER DATABASE (Transact-SQL) e Impostazione delle opzioni di database.

L'opzione SET QUOTED_IDENTIFIER viene impostata in fase di analisi. L'impostazione in fase di analisi indica che, se l'istruzione SET è inclusa nel batch o nella stored procedure, l'istruzione viene attivata indipendentemente dal fatto che l'esecuzione del codice raggiunga effettivamente tale punto. L'istruzione SET diventa inoltre attiva prima dell'esecuzione di qualsiasi istruzione.

L'uso di parentesi, [ e ], per delimitare gli identificatori resta invariato anche con l'impostazione QUOTED_IDENTIFIER.

Autorizzazioni

È richiesta l'appartenenza al ruolo public.

Esempi

A. Utilizzo dell'opzione per l'identificatore tra virgolette 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
-- 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. Utilizzo dell'opzione per l'identificatore tra virgolette 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 AdventureWorks2008R2;
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
      WHERE TABLE_NAME = 'Test')
   DROP TABLE dbo.Test;
GO
USE AdventureWorks2008R2;
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

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