SET QUOTED_IDENTIFIER (Transact-SQL)SET QUOTED_IDENTIFIER (Transact-SQL)

SI APPLICA A: sìSQL Server (a partire dalla versione 2008) sìDatabase SQL di AzuresìAzure SQL Data Warehouse sìParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Impone in SQL ServerSQL Server la conformità alle regole ISO relative all'utilizzo delle virgolette per delimitare identificatori e stringhe letterali.Causes SQL ServerSQL Server to follow the ISO rules regarding quotation mark delimiting identifiers and literal strings. Gli identificatori delimitati da virgolette doppie possono essere parole chiave riservate Transact-SQLTransact-SQL o possono includere caratteri normalmente non consentiti dalle regole della sintassi Transact-SQLTransact-SQL per gli identificatori.Identifiers delimited by double quotation marks can be either Transact-SQLTransact-SQL reserved keywords or can contain characters not generally allowed by the Transact-SQLTransact-SQL syntax rules for identifiers.

Icona di collegamento a un argomentoConvenzioni della sintassi Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintassiSyntax

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

RemarksRemarks

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.When SET QUOTED_IDENTIFIER is ON, identifiers can be delimited by double quotation marks, and literals must be delimited by single quotation marks. 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-SQLTransact-SQL.When SET QUOTED_IDENTIFIER is OFF, identifiers cannot be quoted and must follow all Transact-SQLTransact-SQL rules for identifiers. Per altre informazioni, vedere Identificatori del database.For more information, see Database Identifiers. È possibile delimitare i valori letterali con virgolette singole o doppie.Literals can be delimited by either single or double quotation marks.

Quando l'opzione SET QUOTED_IDENTIFIER è impostata su ON (impostazione predefinita), tutte le stringhe delimitate da virgolette doppie vengono interpretate come identificatori di oggetto.When SET QUOTED_IDENTIFIER is ON (default), all strings delimited by double quotation marks are interpreted as object identifiers. Gli identificatori delimitati pertanto non devono necessariamente essere conformi alle regole per gli identificatori di Transact-SQLTransact-SQL.Therefore, quoted identifiers do not have to follow the Transact-SQLTransact-SQL rules for identifiers. Possono essere parole chiave riservate e includere caratteri normalmente non consentiti negli identificatori Transact-SQLTransact-SQL.They can be reserved keywords and can include characters not generally allowed in Transact-SQLTransact-SQL identifiers. Non è possibile utilizzare le virgolette doppie per delimitare espressioni di stringhe letterali. Inoltre le stringhe letterali devono essere racchiuse tra virgolette singole.Double quotation marks cannot be used to delimit literal string expressions; single quotation marks must be used to enclose literal strings. Se la stringa letterale contiene una virgoletta singola ('), questa può essere rappresentata da due virgolette singole (").If a single quotation mark (') is part of the literal string, it can be represented by two single quotation marks ("). Quando si utilizzano parole chiave riservate per nomi di oggetti nel database, è necessario che l'opzione SET QUOTED_IDENTIFIER sia impostata su ON.SET QUOTED_IDENTIFIER must be ON when reserved keywords are used for object names in the database.

Quando l'opzione SET QUOTED_IDENTIFIER è impostata su OFF, è possibile delimitare le stringhe letterali nelle espressioni con virgolette singole o doppie.When SET QUOTED_IDENTIFIER is OFF, literal strings in expressions can be delimited by single or double quotation marks. Se una stringa letterale è delimitata da virgolette doppie, la stringa può includere virgolette singole, ad esempio gli apostrofi.If a literal string is delimited by double quotation marks, the string can contain embedded single quotation marks, such as apostrophes.

È 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.SET QUOTED_IDENTIFIER must be ON when you are creating or changing indexes on computed columns or indexed views. 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.If SET QUOTED_IDENTIFIER is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. Per altre informazioni sulle impostazioni dell'opzione SET necessarie per viste indicizzate e indici nelle colonne calcolate, vedere "Considerazioni sull'uso delle istruzioni SET" nell'argomento Istruzioni SET.For more information about required SET option settings with indexed views and indexes on computed columns, see "Considerations When You Use the SET Statements" in SET Statements.

SET QUOTED_IDENTIFIER deve essere impostata su ON durante la creazione di un indice filtrato.SET QUOTED_IDENTIFIER must be ON when you are creating a filtered index.

SET QUOTED_IDENTIFIER deve essere impostata su ON quando si richiamano metodi con tipo di dati XML.SET QUOTED_IDENTIFIER must be ON when you invoke XML data type methods.

Il driver ODBC di SQL ServerSQL Server Native Client e il provider OLE DB SQL ServerSQL Server Native Client per SQL ServerSQL Server impostano automaticamente l'opzione QUOTED_IDENTIFIER su ON al momento della connessione.The SQL ServerSQL Server Native Client ODBC driver and SQL ServerSQL Server Native Client OLE DB Provider for SQL ServerSQL Server automatically set QUOTED_IDENTIFIER to ON when connecting. È possibile configurare questa impostazione nelle origini dei dati ODBC, negli attributi di connessione ODBC o nelle proprietà di connessione OLE DB.This can be configured in ODBC data sources, in ODBC connection attributes, or OLE DB connection properties. L'impostazione predefinita dell'opzione SET QUOTED_IDENTIFIER è OFF per le connessioni dalle applicazioni DB-Library.The default for SET QUOTED_IDENTIFIER is OFF for connections from DB-Library applications.

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.When a table is created, the QUOTED IDENTIFIER option is always stored as ON in the table's metadata even if the option is set to OFF when the table is created.

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.When a stored procedure is created, the SET QUOTED_IDENTIFIER and SET ANSI_NULLS settings are captured and used for subsequent invocations of that stored procedure.

Quando viene eseguita all'interno di una stored procedure, l'impostazione dell'opzione SET QUOTED_IDENTIFIER non viene modificata.When executed inside a stored procedure, the setting of SET QUOTED_IDENTIFIER is not changed.

Quando l'opzione SET ANSI_DEFAULTS è impostata su ON, l'opzione SET QUOTED_IDENTIFIER risulta abilitata.When SET ANSI_DEFAULTS is ON, SET QUOTED_IDENTIFIER is enabled.

SET QUOTED_IDENTIFIER corrisponde inoltre all'impostazione QUOTED_IDENTIFER di ALTER DATABASE.SET QUOTED_IDENTIFIER also corresponds to the QUOTED_IDENTIFIER setting of ALTER DATABASE. Per altre informazioni sulle impostazioni del database, vedere ALTER DATABASE.For more information about database settings, see ALTER DATABASE.

SET QUOTED_IDENTIFIER diventa effettiva in fase di analisi e influisce solo sull'analisi, non sull'esecuzione della query.SET QUOTED_IDENTIFIER takes effect at parse-time and only affects parsing, not query execution.

Per un batch ad hoc di livello superiore l'analisi viene avviata usando l'impostazione corrente della sessione per QUOTED_IDENTIFIER.For a top-level ad-hoc batch parsing begins using the session's current setting for 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.As the batch is parsed any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, and save that setting for the session. Al termine dell'analisi e dell'esecuzione del batch, l'impostazione QUOTED_IDENTIFER della sessione verrà pertanto impostata in base all'ultima occorrenza di SET QUOTED_IDENTIFIER nel batch.So after the batch is parsed and executed, the session's QUOTED_IDENTIFER setting will be set according to the last occurrence of SET QUOTED_IDENTIFIER in the batch.

Le istruzione 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.Static SQL in a stored procedure is parsed using the QUOTED_IDENTIFIER setting in effect for the batch that created or altered the stored procedure. SET QUOTED_IDENTIFIER non produce alcun effetto quando si trova nel corpo di una stored procedure come istruzione SQL statica.SET QUOTED_IDENTIFIER has no effect when it appears in the body of a stored procedure as static SQL.

Per un batch annidato che usa sp_executesql o exec() l'analisi viene avviata tramite l'impostazione QUOTED_IDENTIFIER della sessione.For a nested batch using sp_executesql or exec() the parsing begins using the QUOTED_IDENTIFIER setting of the session. Se il batch annidato si trova all'interno di una stored procedure, l'analisi viene avviata tramite l'impostazione QUOTED_IDENTIFIER della stored procedure.If the nested batch is inside a stored procedure the parsing starts using the QUOTED_IDENTIFIER setting of the 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.As the nested batch is parsed, any occurrence of SET QUOTED_IDENTIFIER will change the parsing behavior from that point on, but the session's QUOTED_IDENTIFIER setting will not be updated.

L'impostazione QUOTED_IDENTIFIER non influisce sull'uso delle parentesi quadre [ e ] per delimitare gli identificatori.Using brackets, [ and ], to delimit identifiers is not affected by the QUOTED_IDENTIFIER setting.

Per visualizzare l'impostazione corrente per questa impostazione, eseguire la query riportata di seguito.To view the current setting for this setting, run the following query.

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

PermissionsPermissions

È richiesta l'appartenenza al ruolo public.Requires membership in the public role.

EsempiExamples

A.A. Utilizzo dell'impostazione per l'identificatore delimitato e di nomi di oggetto corrispondenti a parole chiave riservateUsing the quoted identifier setting and reserved word object names

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.The following example shows that the SET QUOTED_IDENTIFIER setting must be ON, and the keywords in table names must be in double quotation marks to create and use objects that have reserved keyword names.

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.B. Utilizzo dell'opzione per l'identificatore delimitato con virgolette singole e doppieUsing the quoted identifier setting with single and double quotation marks

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.The following example shows the way single and double quotation marks are used in string expressions with SET QUOTED_IDENTIFIER set to ON and 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

Set di risultati:Here is the result set.

 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

Vedere ancheSee Also