Begrenzte Bezeichner (Datenbankmodul)

Ein Bezeichner, der alle Regeln für das Format von Bezeichnern erfüllt, kann mit oder ohne Begrenzungszeichen verwendet werden. Ein Bezeichner, der die Regeln für das Format von regulären Bezeichnern nicht erfüllt, muss immer begrenzt sein.

HinweisHinweis

Microsoft SQL Server erkennt weder begrenzte Variablennamen noch begrenzte Parameter für gespeicherte Prozeduren. Bei diesen Bezeichnertypen müssen die Regeln für normale Bezeichner eingehalten werden.

Begrenzte Bezeichner können in den folgenden Situationen verwendet werden:

  • Wenn reservierte Wörter für Objektnamen oder Teile von Objektnamen verwendet werden.

    Reservierte Schlüsselwörter sollten nicht als Objektnamen verwendet werden. Datenbanken, die von vorhergehenden Versionen von SQL Server aktualisiert wurden, enthalten eventuell Bezeichner mit Wörtern, die in der früheren Version nicht reserviert waren, jedoch in der aktuellen Version von SQL Server reserviert sind. Sie können mithilfe begrenzter Bezeichner auf das Objekt verweisen, bis der Name geändert werden kann.

  • Wenn Zeichen verwendet werden, die nicht als gekennzeichnete Bezeichner aufgeführt sind.

    In SQL Server kann jedes Zeichen der aktuellen Codepage in einem begrenzten Bezeichner verwendet werden. Die willkürliche Verwendung von Sonderzeichen in einem Objektnamen kann jedoch dazu führen, dass SQL-Anweisungen und -Skripts schwer zu lesen und zu verwalten sind. Sie können beispielsweise eine Tabelle mit dem Namen Employee] erstellen, der auch die schließende eckige Klammer umfasst. Dazu müssen Sie die schließende eckige Klammer wie im folgenden Beispiel durch zwei weitere eckige Klammern kennzeichnen:

    CREATE TABLE [Employee]]] 
    (
    EmployeeID int IDENTITY (1,1) NOT NULL,
    FirstName varchar(30),
    LastName varchar(30)
    )
    
HinweisHinweis

Begrenzungszeichen werden ausschließlich für Bezeichner verwendet. Begrenzungszeichen können nicht für Schlüsselwörter verwendet werden, auch wenn sie in SQL Server als reserviert gekennzeichnet sind.

Die folgenden Typen von Begrenzungszeichen stehen in Transact-SQL zur Verfügung:

  • Bezeichner in Anführungszeichen werden durch doppelte Anführungszeichen (") begrenzt:

    SELECT * FROM "Blanks in Table Name"
    
  • Bezeichner in Klammern werden durch eckige Klammern ([ ]) begrenzt:

    SELECT * FROM [Blanks In Table Name]
    

Bezeichner in Anführungszeichen sind nur dann gültig, wenn die Option QUOTED_IDENTIFIER auf ON festgelegt ist. Standardmäßig legen Microsoft OLE DB-Anbieter für SQL Server und der SQL Server-ODBC-Treiber die Option QUOTED_IDENTIFIER beim Herstellen einer Verbindung auf ON fest.

Unabhängig von der verwendeten Schnittstelle können einzelne Anwendungen oder Benutzer die Einstellung jederzeit ändern. SQL Server stellt verschiedene Möglichkeiten bereit, um diese Option anzugeben. In SQL Server Management Studio kann die Option beispielsweise in einem Dialogfeld festgelegt werden. In Transact-SQL kann die Option mithilfe von SET QUOTED_IDENTIFIER auf verschiedenen Ebenen festgelegt werden: Sie können die Option QUOTED_IDENTIFIER von ALTER DATABASE oder die Option user options von sp_configure verwenden.

Wenn QUOTED_IDENTIFIER auf ON festgelegt ist, befolgt SQL Server die ISO-Regeln zum Verwenden von doppelten (") und einfachen (') Anführungszeichen in SQL-Anweisungen. Beispiel:

  • Doppelte Anführungszeichen können nur zur Begrenzung von Bezeichnern verwendet werden. Sie können hingegen nicht zur Begrenzung von Zeichenfolgen verwendet werden.

    Damit die Kompatibilität mit vorhandenen Anwendungen sichergestellt ist, erzwingt SQL Server diese Regel nicht vollständig. Zeichenfolgen können in doppelte Anführungszeichen eingeschlossen werden, wenn die Zeichenfolge nicht die Länge eines Bezeichners überschreitet. Diese Vorgehensweise wird nicht empfohlen.

  • Einfache Anführungszeichen müssen zum Einschließen von Zeichenfolgen verwendet werden. Sie können nicht zur Begrenzung von Bezeichnern verwendet werden.

    Falls die Zeichenfolge ein eingebettetes einfaches Anführungszeichen enthält, sollten Sie vor dem eingebetteten Anführungszeichen ein weiteres einfaches Anführungszeichen einfügen. Beispiel:

    SELECT * FROM "My Table"
    WHERE "Last Name" = 'O''Brien'
    
HinweisHinweis

Wenn bei der Bennennung eines Objekts begrenzte Bezeichner verwendet werden und der Objektname nachfolgende Leerzeichen enthält, wird der Objektname in SQL Server ohne die nachfolgenden Leerzeichen gespeichert.

Wenn QUOTED_IDENTIFIER auf OFF festgelegt ist, gelten in SQL Server für einfache und doppelte Anführungszeichen die folgenden Regeln:

  • Anführungszeichen können nicht zur Begrenzung von Bezeichnern verwendet werden. Stattdessen müssen Klammern als Begrenzungszeichen verwendet werden.

  • Zum Einschließen von Zeichenfolgen können einfache oder doppelte Anführungszeichen verwendet werden.

    Falls doppelte Anführungszeichen verwendet werden, müssen eingebettete einfache Anführungszeichen nicht durch zwei einfache Anführungszeichen angezeigt werden. Beispiel:

    SELECT * FROM [My Table]
    WHERE [Last Name] = "O'Brien"
    

Begrenzungszeichen in eckigen Klammern können jederzeit verwendet werden; die Einstellung für QUOTED_IDENTIFIER spielt keine Rolle.

Regeln für begrenzte Bezeichner

Die folgenden Regeln gelten für begrenzte Bezeichner:

  • Begrenzte Bezeichner können die gleiche Anzahl von Zeichen enthalten wie reguläre Bezeichner. Die Anzahl von Zeichen kann zwischen 1 und 128 liegen, wobei die Begrenzungszeichen nicht gezählt werden. Bei lokalen temporären Tabellen können Bezeichner maximal 116 Zeichen umfassen.

  • Der Hauptteil des Bezeichners kann jede Kombination von Zeichen der aktuellen Codepage enthalten, mit Ausnahme der Begrenzungszeichen selbst. Begrenzte Bezeichner können beispielsweise Leerzeichen, alle Zeichen, die für reguläre Bezeichner gültig sind, sowie alle der folgenden Zeichen enthalten:

    Tilde (~)

    Bindestrich (-)

    Ausrufezeichen (!)

    geschweifte Klammer links ({)

    Prozent (%)

    geschweifte Klammer rechts (})

    Caret-Zeichen (^)

    Apostroph (')

    Kaufmännisches Und-Zeichen (&)

    Punkt (.)

    runde Klammer links (()

    umgekehrter Schrägstrich (\)

    runde Klammer rechts ())

    Graviszeichen (`)

In den folgenden Beispielen werden Bezeichner in Anführungszeichen für Tabellen- und Spaltennamen verwendet. Dabei werden beide Methoden zum Angeben von begrenzten Bezeichnern gezeigt:

SET QUOTED_IDENTIFIER ON;
GO
CREATE TABLE "$Employee Data"
(
 "^First Name"   varchar(25) NOT NULL,
 "^Last Name"   varchar(25) NOT NULL,
 "^Dept ID"   int
);
GO

-- INSERT statements go here.
SET QUOTED_IDENTIFIER OFF;
GO
CREATE TABLE [^$Employee Data]
(
 [^First Name]   varchar(25) NOT NULL,
 [^Last Name]   varchar(25) NOT NULL,
 [^Dept ID]   int
);
GO
-- INSERT statements go here.

Nachdem die $Employee Data- und die ^$Employee Data-Tabelle erstellt und die Daten eingegeben wurden, können die Zeilen wie im Folgenden abgerufen werden:

SET QUOTED_IDENTIFIER ON;
GO
SELECT * 
FROM "$Employee Data"
SET QUOTED_IDENTIFIER OFF;
GO
-- Or
SELECT *
FROM [^$Employee Data]

Im folgenden Beispiel sind in einer Tabelle mit dem Namen table die Spalten tablename, user, select, insert, update und delete enthalten. Da TABLE, SELECT, INSERT, UPDATE und DELETE reservierte Schlüsselwörter sind, müssen die Bezeichner jedes Mal begrenzt werden, wenn auf die Objekte zugegriffen wird.

SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE "table"
(
 tablename char(128) NOT NULL,
 "USER"    char(128) NOT NULL,
 "SELECT"  char(128) NOT NULL,
 "INSERT"  char(128) NOT NULL,
 "UPDATE"  char(128) NOT NULL,
 "DELETE"  char(128) NOT NULL
);
GO

Falls die Option SET QUOTED_IDENTIFIER nicht auf ON festgelegt ist, kann nur dann auf Tabellen und Spalten zugegriffen werden, wenn Sie eckige Klammern als Begrenzungszeichen verwenden: Beispiel:

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM "table";
GO

Dies ist das Resultset.:

Msg 170, Level 15, State 1
Line 1: Incorrect syntax near 'table'.

Das folgende Beispiel ist funktionsfähig, weil als Begrenzungszeichen Klammern verwendet wurden:

SET QUOTED_IDENTIFIER OFF;
GO
SELECT * 
FROM [table];
GO

Begrenzen von mehrteiligen Bezeichnern

Beim Verwenden vollqualifizierter Objektnamen ist es eventuell erforderlich, mehr als einen der Bezeichner zu begrenzen, aus denen sich der Objektname zusammensetzt. Jeder Bezeichner muss einzeln begrenzt werden. Beispiel:

/* ISO quoted identifier syntax */
SELECT *
FROM "My DB"."My#UserID"."My.Table";
GO

Oder

/* Transact-SQL bracketed identifier syntax */
/* Not available in SQL Server 6.5 or earlier */
SELECT *
FROM [My DB].[My#UserID].[My.Table];
GO

Für die Begrenzung mehrteiliger gespeicherter Prozedurnamen in der ODBC CALL-Anweisung gelten spezielle Regeln. Weitere Informationen finden Sie unter Aufrufen von gespeicherten Prozeduren.

Verwenden von Bezeichnern als Parameter in SQL Server

Im Rahmen vieler gespeicherter Systemprozeduren, Funktionen und DBCC-Anweisungen werden Objektnamen als Parameter verwendet. Einige dieser Parameter nehmen aus mehreren Teilen bestehende Objektnamen an, während für andere nur einteilige Namen verwendet werden können. Ob eine Prozedur einen einteiligen oder mehrteiligen Namen erwartet, bestimmt, wie ein Parameter analysiert und intern von SQL Server verwendet wird.

Einteilige Parameternamen

Wenn der Parameter ein einteiliger Bezeichner ist, kann der Name folgendermaßen angegeben werden:

  • Ohne Anführungszeichen oder Begrenzungszeichen.

  • Eingeschlossen in einfache Anführungszeichen.

  • Eingeschlossen in doppelte Anführungszeichen.

  • Eingeschlossen in eckige Klammern.

Bei einteiligen Namen steht die Zeichenfolge innerhalb der einfachen Anführungszeichen für den Objektnamen. Falls Begrenzungszeichen innerhalb einfacher Anführungszeichen verwendet werden, werden die Begrenzungszeichen als Teil des Namens behandelt.

Wenn der Name einen Punkt oder andere Zeichen enthält, die nicht zu dem Zeichensatz gehören, der für reguläre Bezeichner definiert wurde, müssen Sie den Objektnamen in einfache Anführungszeichen, doppelte Anführungszeichen oder eckige Klammern einschließen.

Mehrteilige Parameternamen

Bei mehrteiligen Parameternamen handelt es sich um vollgekennzeichnete Namen, die den Datenbank- oder Schemanamen sowie den Objektnamen enthalten. Wenn in SQL Server ein mehrteiliger Name als Parameter verwendet wird, muss die gesamte Zeichenfolge, aus der sich der mehrteilige Name zusammensetzt, in ein Paar von einfachen Anführungszeichen eingeschlossen sein.

EXEC MyProcedure @name = 'dbo.Employees'

Falls einzelne Namensteile Begrenzungszeichen benötigen, sollte gegebenenfalls jeder Teil des Namens separat begrenzt werden. Wenn z. B. ein Namensteil einen Punkt, ein doppeltes Anführungszeichen oder eine linke oder rechte eckige Klammer enthält, verwenden Sie eckige Klammern oder doppelte Anführungszeichen, um den Teil zu begrenzen. Schließen Sie den vollständigen Namen in einfache Anführungszeichen ein.

Der Tabellenname tab.one enthält z. B. einen Punkt. Wenn Sie verhindern möchten, dass der Name als dreiteiliger Name dbo.tab.one interpretiert wird, begrenzen Sie den Tabellennamen.

EXEC sp_help 'dbo.[tab.one]'

Im folgenden Beispiel wird gezeigt, wie der gleiche Tabellenname mit doppelten Anführungszeichen begrenzt wird:

SET QUOTED_IDENTIFIER ON 
GO 
EXEC sp_help 'dbo."tab.one"'
GO