SET QUOTED_IDENTIFIER (Transact-SQL)

Gäller för:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalysplattformssystem (PDW)SQL-analysslutpunkt i Microsoft FabricLager i Microsoft FabricSQL-databas i Microsoft Fabric

Gör att SQL Server följer ISO-reglerna gällande citattecken som avgränsar identifierare och bokstavliga strängar. Identifierare som avgränsas med dubbla citattecken kan antingen vara Transact-SQL reserverade nyckelord eller innehålla tecken som vanligtvis inte tillåts enligt Transact-SQL syntaxregler för identifierare.

Transact-SQL syntaxkonventioner

Syntax

Syntax for SQL Server, Azure SQL Database, serverless SQL pool i Azure Synapse Analytics och Microsoft Fabric.

SET QUOTED_IDENTIFIER { ON | OFF }

Syntax för Azure Synapse Analytics och Parallel Data Warehouse.

SET QUOTED_IDENTIFIER ON

Anmärkningar

När SET QUOTED_IDENTIFIER är ON (standard) kan identifierare avgränsas med dubbla citattecken (""), och literaler måste avgränsas med enkla citattecken (''). Alla strängar som avgränsas med dubbla citattecken tolkas som objektidentifierare. Angivna identifierare behöver inte följa de Transact-SQL reglerna för identifierare. De kan vara nyckelord och inkludera tecken som inte är tillåtna i Transact-SQL identifierare. Om ett dubbelcitattecken (") ingår i identifieraren kan det representeras med två dubbelcitattecken (""). SET QUOTED_IDENTIFIER måste vara ON när reserverade nyckelord används för objektnamn i databasen.

När SET QUOTED_IDENTIFIER är OFF, kan identifierare inte citeras och måste följa alla Transact-SQL regler för identifierare. Mer information finns i Databasidentifierare. Bokstavliga tal kan avgränsas med antingen enkla eller dubbla citationstecken. Om en bokstavlig sträng avgränsas med dubbla citattecken kan strängen innehålla inbäddade enkla citattecken, såsom apostrofer.

Anmärkning

QUOTED_IDENTIFIER påverkar inte avgränsade identifierare inom parentes ([ och ]).

SET QUOTED_IDENTIFIER måste vara ON när du skapar eller ändrar index för beräknade kolumner eller indexerade vyer. Om SET QUOTED_IDENTIFIER är OFF, så CREATEmisslyckas , UPDATE, INSERT, och DELETE satser på tabeller med index på beräknade kolumner, eller tabeller med indexerade vyer. För mer information om nödvändiga SET alternativinställningar med indexerade vyer och index på beräknade kolumner, se Considerations när du använder SET-satserna.

SET QUOTED_IDENTIFIER Det måste vara ON när du skapar ett filtrerat index.

SET QUOTED_IDENTIFIER Det måste vara ON när du anropar XML-datatypmetoder .

SQL Server Native Client ODBC-drivrutinen och SQL Server Native Client OLE DB Provider för SQL Server är automatiskt inställda QUOTED_IDENTIFIERON vid anslutning. Detta kan konfigureras i ODBC-datakällor, i ODBC-anslutningsattribut eller i OLE DB-anslutningsegenskaper. Standardinställningen för SET QUOTED_IDENTIFIER är OFF för anslutningar från DB-Library applikationer.

När en tabell skapas lagras QUOTED IDENTIFIER alternativet alltid som ON i tabellens metadata, även om alternativet är inställt till OFF när tabellen skapas.

När en lagrad projell skapas fångas och SET ANSI_NULLS inställningarna SET QUOTED_IDENTIFIER och används för efterföljande anrop av den lagrade proceduren.

När den körs i en lagrad prozedur ändras inte inställningen av SET QUOTED_IDENTIFIER av.

När SET ANSI_DEFAULTS är ON, QUOTED_IDENTIFIER är också ON.

SET QUOTED_IDENTIFIERmotsvarar miljön QUOTED_IDENTIFIERi ALTER DATABASE.

SET QUOTED_IDENTIFIER träder i kraft vid Transact-SQL parse-tid och påverkar endast parsing, inte frågeoptimering eller frågeexekvering.

För en toppnivå ad hoc-batch börjar parsing med sessionens nuvarande inställning för QUOTED_IDENTIFIER. När batchen analyseras ändrar varje förekomst av SET QUOTED_IDENTIFIER parsningsbeteendet från och med den punkten, och spara den inställningen för sessionen. Så efter att batchen har parsat och körts kommer sessionens QUOTED_IDENTIFIER inställning att sättas enligt den senaste förekomsten av SET QUOTED_IDENTIFIER i batchen.

Statisk Transact-SQL i en lagrad procedur tolkas med inställningen QUOTED_IDENTIFIER som gäller för den batch som skapade eller ändrade den lagrade proceduren. SET QUOTED_IDENTIFIER har ingen effekt när den visas i kroppen av en lagrad procedur som statisk Transact-SQL.

För en nästlad batch som använder sp_executesql eller exec(), börjar parsningen med sessionens QUOTED_IDENTIFIER inställning. Om den nästlade batchen finns i en lagrad procedur börjar parsningen med inställningen QUOTED_IDENTIFIER av den lagrade proceduren. När den nästlade batchen analyseras ändras parsningsbeteendet SET QUOTED_IDENTIFIER från och med det, men sessionens QUOTED_IDENTIFIER inställning uppdateras inte.

För att se den aktuella inställningen för denna inställning, kör följande fråga:

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

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

SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;

Permissions

Kräver medlemskap i offentlig roll.

Examples

A. Använd inställningen för citerad identifierare och objekt namn på reserverade ord

Följande exempel visar att inställningen SET QUOTED_IDENTIFIER måste vara ON, och nyckelorden i tabellnamn måste vara inom citattecken för att skapa och använda objekt som har reserverade nyckelordsnamn.

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. Använd citationsidentifieraren med enkla och dubbla citattecken

Följande exempel visar hur enkla och dubbla citattecken används i stränguttryck med SET QUOTED_IDENTIFIER satt till ON och 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

Här är resultatet.

 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