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
, CREATE
le istruzioni , INSERT
UPDATE
, 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
Contenuto correlato
- CREATE DATABASE
- CREATE DEFAULT (Transact-SQL)
- CREATE PROCEDURE (Transact-SQL)
- CREATE RULE (Transact-SQL)
- CREATE TABLE (Transact-SQL)
- CREATE TRIGGER (Transact-SQL)
- CREATE VIEW (Transact-SQL)
- Tipi di dati (Transact-SQL)
- EXECUTE (Transact-SQL)
- SELECT (Transact-SQL)
- Istruzioni SET (Transact-SQL)
- SET ANSI_DEFAULTS (Transact-SQL)
- sp_rename
- Identificatori di database