SET QUOTED_IDENTIFIER (Transact-SQL)
Gilt für:SQL Server
Azure SQL-Datenbank
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-Endpunkt in Microsoft Fabric
Warehouse in Microsoft Fabric
Bewirkt, dass SQL Server die ISO-Regeln für Anführungszeichen bei Bezeichnern und Literalzeichenfolgen befolgt. Bei Bezeichnern, die mit doppelten Anführungszeichen begrenzt werden, kann es sich um reservierte Transact-SQL-Schlüsselwörter oder um Bezeichner mit Zeichen handeln, die nach den Transact-SQL-Syntaxregeln für Bezeichner im Allgemeinen nicht zulässig sind.
Transact-SQL-Syntaxkonventionen
Syntax
-- Syntax for SQL Server, Azure SQL Database, serverless SQL pool in Azure Synapse Analytics, and Microsoft Fabric
SET QUOTED_IDENTIFIER { ON | OFF }
-- Syntax for Azure Synapse Analytics and Parallel Data Warehouse
SET QUOTED_IDENTIFIER ON
Hinweis
Informationen zum Anzeigen der Transact-SQL-Syntax für SQL Server 2014 oder früher finden Sie unter Dokumentation zu früheren Versionen.
Hinweise
Wenn SET QUOTED_IDENTIFIER
auf ON festgelegt ist, können Bezeichner durch doppelte Anführungszeichen (" ") begrenzt werden. Literale müssen in diesem Fall durch einfache Anführungszeichen (' ') begrenzt werden. Alle Zeichenfolgen, die durch doppelte Anführungszeichen begrenzt werden, werden als Objektbezeichner interpretiert. Daher müssen Bezeichner in Anführungszeichen nicht den Transact-SQL-Regeln für Bezeichner entsprechen. Sie können reservierte Schlüsselwörter darstellen und Zeichen einschließen, die in Transact-SQL-Bezeichnern im Allgemeinen nicht zulässig sind. Doppelte Anführungszeichen dürfen nicht zum Begrenzen von Ausdrücken mit Literalzeichenfolgen verwendet werden, da Literalzeichenfolgen in einfache Anführungszeichen eingeschlossen werden müssen. Ist ein einfaches Anführungszeichen (') Teil des Zeichenfolgenliterals, kann es durch zwei einfache Anführungszeichen (") dargestellt werden. SET QUOTED_IDENTIFIER
muss auf ON festgelegt sein, wenn in der Datenbank reservierte Schlüsselwörter für Objektnamen verwendet werden.
Wenn SET QUOTED_IDENTIFIER
auf OFF festgelegt ist, dürfen Bezeichner nicht in Anführungszeichen eingeschlossen werden und müssen allen Transact-SQL-Regeln für Bezeichner entsprechen. Weitere Informationen finden Sie unter Datenbankbezeichner. Literale können in einfache oder doppelte Anführungszeichen eingeschlossen werden. Eine in doppelte Anführungszeichen eingeschlossene Literalzeichenfolge kann eingebundene einfache Anführungszeichen, wie z. B. Apostrophe, enthalten.
Hinweis
QUOTED_IDENTIFIER wirkt sich nicht auf Begrenzungsbezeichner aus, die in eckige Klammern ([ ]) eingeschlossen sind.
SET QUOTED_IDENTIFIER
muss auf ON festgelegt sein, wenn Indizes für berechnete Spalten oder indizierte Sichten erstellt oder geändert werden. Ist SET QUOTED_IDENTIFIER
auf OFF festgelegt, schlagen CREATE-, UPDATE-, INSERT- und DELETE-Anweisungen in Tabellen mit Indizes für berechneten Spalte oder in Tabellen mit indizierten Sichten fehl. Weitere Informationen zu den erforderlichen Einstellungen der SET-Option mit indizierten Sichten und Indizes für berechnete Spalten finden Sie unter Überlegungen beim Verwenden von SET-Anweisungen.
SET QUOTED_IDENTIFIER
muss auf ON festgelegt sein, wenn Sie einen gefilterten Index erstellen.
SET QUOTED_IDENTIFIER
muss auf ON festgelegt sein, wenn Sie XML-Datentypmethoden aufrufen.
Der SQL Server Native Client-ODBC-Treiber und der SQL Server Native Client-OLE DB-Anbieter für SQL Server legen QUOTED_IDENTIFIER beim Herstellen einer Verbindung automatisch auf ON fest. Diese Einstellung kann in ODBC-Datenquellen, in ODBC-Verbindungsattributen oder in OLE DB-Verbindungseigenschaften konfiguriert werden. SET QUOTED_IDENTIFIER ist für Verbindungen von DB-Library-Anwendungen standardmäßig auf OFF festgelegt.
Beim Erstellen einer Tabelle wird die Option QUOTED IDENTIFIER immer als ON in den Metadaten der Tabelle gespeichert, selbst wenn die Option beim Erstellen der Tabelle auf OFF festgelegt war.
Wenn eine gespeicherte Prozedur erstellt wird, werden die SET QUOTED_IDENTIFIER- und SET ANSI_NULLS-Einstellungen aufgezeichnet und in späteren Aufrufen der gespeicherten Prozedur wieder verwendet.
Wird SET QUOTED_IDENTIFIER innerhalb einer gespeicherten Prozedur ausgeführt, wird die Einstellung nicht geändert.
Wenn SET ANSI_DEFAULTS
auf ON festgelegt ist, wird auch QUOTED_IDENTIFIER auf ON festgelegt.
SET QUOTED_IDENTIFIER
entspricht auch der QUOTED_IDENTIFIER-Einstellung von ALTER DATABASE.
SET QUOTED_IDENTIFIER
ist während der Analysezeit von Transact-SQL gültig und wirkt sich nur auf die Analyse aus, nicht auf die Optimierung oder Ausführung der Abfrage.
Für einen allgemeinen Ad-hoc-Batch beginnt die Analyse unter Verwendung der aktuellen Sitzungseinstellung für QUOTED_IDENTIFIER. Bei der Analyse des Batches verändert jedes Auftreten von SET QUOTED_IDENTIFIER
ab diesem Zeitpunkt das Analyseverhalten, und diese Einstellung wird für die Sitzung gespeichert. Nachdem der Batch analysiert und ausgeführt wurde, wird die QUOTED_IDENTIFER-Einstellung der Sitzung basierend auf dem letzten Auftreten von SET QUOTED_IDENTIFIER
im Batch festgelegt.
Statische Transact-SQL-Anweisungen in einer gespeicherten Prozedur werden mithilfe der QUOTED_IDENTIFIER-Einstellung des Batches analysiert, der die gespeicherte Prozedur erstellt oder geändert hat. SET QUOTED_IDENTIFIER
hat beim Auftreten im Textkörper einer gespeicherten Prozedur als statische Transact-SQL-Anweisung keinerlei Auswirkungen.
Für einen geschachtelten Batch, der sp_executesql
oder exec()
verwendet, beginnt die Analyse bei Verwendung der QUOTED_IDENTIFIER-Einstellung der Sitzung. Wenn sich der geschachtelte Batch innerhalb einer gespeicherten Prozedur befindet, startet die Analyse bei Verwendung der QUOTED_IDENTIFIER-Einstellung der gespeicherten Prozedur. Bei der Analyse des geschachtelten Batches verändert jedes Auftreten von SET QUOTED_IDENTIFIER
ab diesem Zeitpunkt das Analyseverhalten, aber die QUOTED_IDENTIFIER-Einstellung der Sitzung wird nicht aktualisiert.
Um die aktuelle Einstellung anzuzeigen, führen Sie die folgende Abfrage aus:
DECLARE @QUOTED_IDENTIFIER VARCHAR(3) = 'OFF';
IF ( (256 & @@OPTIONS) = 256 )
BEGIN
SET @QUOTED_IDENTIFIER = 'ON';
END
SELECT @QUOTED_IDENTIFIER AS QUOTED_IDENTIFIER;
Berechtigungen
Erfordert die Mitgliedschaft in der Rolle PUBLIC
.
Beispiele
A. Verwenden der quoted identifier-Einstellung und Verwenden von Objektnamen mit reservierten Wörtern
Im folgenden Beispiel wird dargestellt, dass die SET QUOTED_IDENTIFIER
-Einstellung auf ON
festgelegt sein muss und dass Schlüsselwörter in Tabellennamen in doppelte Anführungszeichen eingeschlossen werden müssen, damit Objekte mit Namen von reservierten Schlüsselwörtern erstellt und verwendet werden können.
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. Verwenden der quoted identifier-Einstellung mit einfachen und doppelten Anführungszeichen
Im folgenden Beispiel wird die Verwendung von einfachen und doppelten Anführungszeichen in Zeichenfolgenausdrücken dargestellt, für die SET QUOTED_IDENTIFIER
einmal auf ON
und einmal auf OFF
festgelegt ist.
SET QUOTED_IDENTIFIER OFF;
GO
USE AdventureWorks2022;
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 ist das Resultset.
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
Weitere Informationen
CREATE DATABASE
CREATE DEFAULT
CREATE PROCEDURE
CREATE RULE
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
Datentypen
EXECUTE
SELECT
SET-Anweisungen
SET ANSI_DEFAULTS
sp_rename
Datenbankbezeichner
Feedback
Feedback senden und anzeigen für