Delen via


SET QUOTED_IDENTIFIER (Transact-SQL)

Van toepassing op:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)SQL Analytics-eindpunt in Microsoft FabricMagazijn in Microsoft FabricSQL-database in Microsoft Fabric

Zorgt ervoor dat SQL Server de ISO-regels volgt met betrekking tot aanhalingstekens en letterlijke strings. Identifiers die door dubbele aanhalingstekens worden gescheiden, kunnen ofwel Transact-SQL gereserveerde trefwoorden zijn of karakters bevatten die doorgaans niet zijn toegestaan door de Transact-SQL syntaxisregels voor identifiers.

Transact-SQL syntaxis-conventies

Syntaxis

Syntax voor SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics en Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Syntaxis voor Azure Synapse Analytics en Parallel Data Warehouse.

SET QUOTED_IDENTIFIER ON

Opmerkingen

Wanneer SET QUOTED_IDENTIFIER is ON (standaard), kunnen identifiers worden gescheiden door dubbele aanhalingstekens (""), en literalen moeten worden afgebakend met enkele aanhalingstekens (''). Alle strings die door dubbele aanhalingstekens worden geïnterpreteerd als objectidentificaties. Aangegeven identificaties hoeven niet de Transact-SQL regels voor identificaties te volgen. Ze kunnen trefwoorden zijn en kunnen tekens bevatten die niet in Transact-SQL identificaties zijn toegestaan. Als een dubbele aanhalingstekens (") deel uitmaakt van de identificatie, kan deze worden weergegeven door twee dubbele aanhalingstekens (""). SET QUOTED_IDENTIFIER moet het moment zijn ON waarop gereserveerde trefwoorden worden gebruikt voor objectnamen in de database.

Wanneer SET QUOTED_IDENTIFIER , OFFkunnen identificatoren niet worden geciteerd en moeten ze alle Transact-SQL regels voor identificaties volgen. Zie Database-id's voor meer informatie. Letterlijke kunnen worden afgebakend door enkelvoudige of dubbele aanhalingstekens. Als een letterlijke string wordt afgebakend door dubbele aanhalingstekens, kan de string ingebedde enkele aanhalingstekens bevatten, zoals apostroffen.

Opmerking

QUOTED_IDENTIFIER beïnvloedt geen afgebakende identificaties die tussen haakjes staan ([ en ]).

SET QUOTED_IDENTIFIER moet worden ON wanneer u indexen maakt of wijzigt in berekende kolommen of geïndexeerde weergaven. Als SET QUOTED_IDENTIFIEROFF, dan CREATEfalen , UPDATE, INSERT, en DELETE de instructies op tabellen met indexen op berekende kolommen, of tabellen met geïndexeerde weergaven. Voor meer informatie over de vereiste SET optie-instellingen met geïndexeerde weergaven en indexen op berekende kolommen, zie Overwegingen wanneer je de SET-instructies gebruikt.

SET QUOTED_IDENTIFIER Dat moet zijn ON wanneer je een gefilterde index maakt.

SET QUOTED_IDENTIFIER Dat moet zijn ON wanneer je XML-datatypemethoden aanroept.

De SQL Server Native Client ODBC-driver en de SQL Server Native Client OLE DB Provider voor SQL Server worden automatisch ingesteld QUOTED_IDENTIFIER op ON bij het verbinden. Dit kan worden geconfigureerd in ODBC-databronnen, in ODBC-verbindingsattributen of OLE DB-verbindingseigenschappen. De standaard voor SET QUOTED_IDENTIFIER is OFF voor verbindingen van DB-Library applicaties.

Wanneer een tabel wordt aangemaakt, wordt de QUOTED IDENTIFIER optie altijd opgeslagen zoals ON in de metadata van de tabel, zelfs als de optie is ingesteld op het moment dat OFF de tabel wordt aangemaakt.

Wanneer een opgeslagen procedure wordt aangemaakt, worden de SET QUOTED_IDENTIFIER en SET ANSI_NULLS instellingen vastgelegd en gebruikt voor latere aanroepen van die opgeslagen procedure.

Wanneer deze wordt uitgevoerd binnen een opgeslagen procedure, wordt de instelling van SET QUOTED_IDENTIFIER niet gewijzigd.

Wanneer SET ANSI_DEFAULTS is ON, QUOTED_IDENTIFIER is ook ON.

SET QUOTED_IDENTIFIERkomt overeen met de QUOTED_IDENTIFIER setting van ALTER DATABASE.

SET QUOTED_IDENTIFIER treedt in werking bij Transact-SQL parse-tijd en beïnvloedt alleen parsing, niet queryoptimalisatie of query-uitvoering.

Voor een topniveau ad hoc batch begint parsen met de huidige instelling van de sessie voor QUOTED_IDENTIFIER. Naarmate de batch wordt geanalyseerd, verandert elke gebeurtenis het SET QUOTED_IDENTIFIER parsinggedrag vanaf dat punt, en sla die instelling op voor de sessie. Dus nadat de batch is geparsed en uitgevoerd, wordt de QUOTED_IDENTIFIER instelling van de sessie ingesteld op basis van het laatste voorkomen van SET QUOTED_IDENTIFIER in de batch.

Statische Transact-SQL in een opgeslagen procedure wordt geanalyseerd met behulp van de QUOTED_IDENTIFIER instelling die geldt voor de batch die de opgeslagen procedure heeft gemaakt of aangepast. SET QUOTED_IDENTIFIER geen effect heeft wanneer het in de inhoud van een opgeslagen procedure verschijnt als statische Transact-SQL.

Voor een geneste batch met sp_executesql of exec(), begint de parsing met de QUOTED_IDENTIFIER instelling van de sessie. Als de geneste batch zich in een opgeslagen procedure bevindt, begint parsing met de QUOTED_IDENTIFIER instelling van de opgeslagen procedure. Naarmate de geneste batch wordt geanalyseerd, verandert elke gebeurtenis van SET QUOTED_IDENTIFIER het parsingsgedrag vanaf dat punt, maar de QUOTED_IDENTIFIER instelling van de sessie wordt niet bijgewerkt.

Om de huidige instelling voor deze instelling te bekijken, voer je de volgende zoekopdracht uit:

DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';

IF ((256 & @@OPTIONS) = 256)
BEGIN
    SET @QUOTED_IDENTIFIER = 'ON';
END

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Permissions

Vereist lidmaatschap van de openbare rol.

Voorbeelden

Eén. Gebruik de instelling voor aanhalingstekens en objectnamen van gereserveerde woorden

Het volgende voorbeeld toont aan dat de SET QUOTED_IDENTIFIER instelling moet zijn ON, en dat de trefwoorden in tabelnamen dubbele aanhalingstekens moeten hebben om objecten te creëren en te gebruiken die gereserveerde trefwoordnamen hebben.

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. Gebruik de instelling voor aanhalingstekens met enkele en dubbele aanhalingstekens

Het volgende voorbeeld toont hoe enkele en dubbele aanhalingstekens worden gebruikt in stringexpressies met SET QUOTED_IDENTIFIER gezet op ON en 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

Hier is het resultatenoverzicht.

 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