Condividi tramite


SET QUOTED_IDENTIFIER (Transact-SQL)

Applies to:SQL Serverdatabase SQL di AzureIstanza gestita di SQL di AzureAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL analytics endpoint in Microsoft FabricWarehouse in Microsoft FabricSQL in Microsoft Fabric

L'impostazione QUOTED_IDENTIFIER fa sì che SQL Server segua le regole ISO per le virgolette edelimiting degli identificatori e delle stringhe letterali. Se si usano virgolette doppie per delimitare gli identificatori, è possibile usare Transact-SQL parole chiave riservate o includere caratteri che le regole di sintassi Transact-SQL in genere non consentono negli identificatori.

convenzioni di 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 Data Warehouse paralleli.

SET QUOTED_IDENTIFIER ON

Osservazioni:

Quando si imposta su ONSET QUOTED_IDENTIFIER (impostazione predefinita), è possibile usare le virgolette doppie ("") per delimitare gli identificatori ed è necessario usare virgolette singole ('') per delimitare i valori letterali. Tutte le stringhe racchiuse tra virgolette doppie vengono interpretate come identificatori di oggetto. Gli identificatori delimitati non devono seguire le regole di Transact-SQL per gli identificatori. Possono essere parole chiave e possono includere caratteri non consentiti negli identificatori Transact-SQL. Se una virgoletta doppia (") fa parte dell'identificatore, è possibile rappresentarla tra due virgolette doppie (""). È necessario impostare su SET QUOTED_IDENTIFIERON quando si usano parole chiave riservate per i nomi degli oggetti nel database.

Quando si imposta SET QUOTED_IDENTIFIER su OFF, non è possibile citare gli identificatori e devono seguire tutte le regole di Transact-SQL per gli identificatori. Per altre informazioni, vedere Identificatori di database. È possibile delimitare i valori letterali tra virgolette singole o doppie. Se si delimita una stringa letterale tra virgolette doppie, la stringa può contenere virgolette singole incorporate, ad esempio apostrofi.

Nota

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

È necessario impostare su SET QUOTED_IDENTIFIERON quando si creano o modificano indici in colonne calcolate o viste indicizzate. Se le SET QUOTED_IDENTIFIEROFFistruzioni , CREATEUPDATE, INSERT, 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.

È necessario impostare su SET QUOTED_IDENTIFIERON quando si crea un indice filtrato.

È necessario impostare su SET QUOTED_IDENTIFIERON quando si richiamano metodi con tipo di dati xml .

Il driver ODBC SQL Server Native Client e SQL Server provider OLE DB di Native Client per SQL Server impostare automaticamente QUOTED_IDENTIFIER su ON durante la connessione. È possibile configurare questa impostazione nelle origini 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 si crea una tabella, i metadati della tabella archiviano sempre l'opzione QUOTED_IDENTIFIER come ON anche se si imposta l'opzione su OFF durante la creazione della tabella.

Quando si crea una stored procedure, le SET QUOTED_IDENTIFIER impostazioni e SET ANSI_NULLS vengono acquisite e usate per le chiamate successive di tale stored procedure.

Quando si esegue SET QUOTED_IDENTIFIER all'interno di una stored procedure, l'impostazione non cambia.

Quando si imposta su SET ANSI_DEFAULTSON, QUOTED_IDENTIFIER viene impostato anche su ON.

SET QUOTED_IDENTIFIER corrisponde all'impostazione QUOTED_IDENTIFIER di ALTER DATABASE.

SET QUOTED_IDENTIFIER ha effetto in fase di analisi Transact-SQL e influisce solo sull'analisi, non sull'ottimizzazione delle query o sull'esecuzione di 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 il 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 viene impostata in base all'ultima occorrenza di SET QUOTED_IDENTIFIER nel batch.

Le Transact-SQL statiche in una stored procedure vengono analizzate usando l'impostazione QUOTED_IDENTIFIER in vigore per il batch che ha creato o modificato la stored procedure. SET QUOTED_IDENTIFIER non ha alcun effetto quando viene visualizzato nel corpo di una stored procedure come Transact-SQL statico.

Per un batch annidato che usa 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 AS 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 predefinito del database pubblico .

Esempi

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

L'esempio seguente mostra che l'impostazione SET QUOTED_IDENTIFIER deve essere ONe le parole chiave nei nomi di tabella devono essere tra virgolette doppie per creare e usare oggetti con nomi di parole chiave riservati.

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 come vengono usate le virgolette singole e doppie nelle espressioni stringa con SET QUOTED_IDENTIFIER impostato su ON e OFF.

SET QUOTED_IDENTIFIER OFF;
GO

USE AdventureWorks2025;
GO

IF EXISTS (SELECT TABLE_NAME
           FROM INFORMATION_SCHEMA.TABLES
           WHERE TABLE_NAME = 'Test')
    DROP TABLE dbo.Test;
GO

USE AdventureWorks2025;
GO

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