Anforderungen an Bezeichner

Objektbezeichner ohne Anführungszeichen:

  • Beginnen Sie mit einem Buchstaben (A-Z, a-z) oder einem Unterstrich („_“).

  • Enthalten nur Buchstaben, Unterstriche, Dezimalstellen (0-9) und Dollarzeichen („$“).

  • Groß-/Kleinschreibung wird nicht unterschieden.

Wenn Sie einen Bezeichner in doppelte Anführungszeichen setzen (z. B. „Mein Bezeichner mit Leerzeichen und Interpunktion“) gelten folgende Regeln:

  • Der Bezeichner unterscheidet zwischen Groß- und Kleinschreibung.

  • Der Bezeichner kann ein beliebiges ASCII-Zeichen vom Leerzeichen (32) bis zur Tilde (126) enthalten und sogar damit beginnen, mit Ausnahme des doppelten Anführungszeichens.

Bemerkung

  • Unabhängig davon, ob ein Bezeichner keine oder doppelte Anführungszeichen enthält, dürfen maximale nur 255 Zeichen (einschließlich Leerzeichen) verwendet werden.

  • Bezeichner können auch durch Zeichenfolgenliterale, Sitzungsvariablen oder Bindungsvariablen spezifiziert werden. Weitere Details dazu finden Sie unter SQL-Variablen.

Unter diesem Thema:

Bezeichner ohne Anführungszeichen

Wenn ein Bezeichner nicht in doppelte Anführungszeichen eingeschlossen ist, muss er mit einem Buchstaben oder einem Unterstrich (_) beginnen und darf keine Sonderzeichen oder Leerzeichen enthalten.

Im Folgenden finden Sie alle Beispiele für gültige Bezeichner. Die Groß-/Kleinschreibung der Zeichen in diesen Bezeichnern wird allerdings nicht beibehalten:

myidentifier
MyIdentifier1
My$identifier
_my_identifier

Bezeichner mit doppelten Anführungszeichen

Bei Bezeichnern mit Trennzeichen, die von doppelten Anführungszeichen eingeschlossen sind, muss die Groß-/Kleinschreibung beachtet werden, und sie können mit allen gültigen Zeichen beginnen und alle gültigen Zeichen enthalten, einschließlich:

  • Zahlen

  • Sonderzeichen (., ', !, @, #, $, %, ^, &, * usw.)

  • ASCII- und Nicht-ASCII-Sonderzeichen

  • Leerzeichen

Beispiel:

"MyIdentifier"
"my.identifier"
"my identifier"
"My 'Identifier'"
"3rd_identifier"
"$Identifier"
"идентификатор"

Wichtig

Wenn ein Objekt mit einem Bezeichner in doppelten Anführungszeichen erstellt wird, muss der Bezeichner bei Bezugnahme in einer Abfrage oder einer anderen SQL-Anweisung exakt wie erstellt angegeben werden, einschließlich der doppelten Anführungszeichen. Fehlende Anführungszeichen können zu einem Object does not exist-Fehler (oder einer ähnlichen Art von Fehler) führen.

Beachten Sie außerdem, dass der gesamte Bezeichner in Anführungszeichen eingeschlossen sein muss, wenn auf ihn in einer Abfrage oder SQL-Anweisung verwiesen wird. Dies ist besonders wichtig, wenn Punkte (.) in Bezeichnern verwendet werden, da Punkte auch in vollqualifizierten Objektnamen zum Trennen der einzelnen Objekte verwendet werden.

Beispiel:

"My.DB"."My.Schema"."Table.1"

Auflösung des Bezeichners

Standardmäßig wendet Snowflake die folgenden Regeln an, um Bezeichner zu speichern (zur Erstellungs-/Definitionszeit) und aufzulösen (in Abfragen und anderen SQL-Anweisungen):

  • Wenn ein Bezeichner nicht in Anführungszeichen gesetzt wird, wird er in Großbuchstaben gespeichert und aufgelöst.

  • Wenn ein Bezeichner in doppelte Anführungszeichen gesetzt wird, wird er genau so gespeichert und aufgelöst, wie er eingegeben wurde, einschließlich Groß-/Kleinschreibung.

Beispielsweise sind die folgenden Namen äquivalent und werden alle zu TABLENAME aufgelöst:

TABLENAME
tablename
tableName
TableName

Im Gegensatz dazu werden die folgenden vier Namen als unterschiedliche, eindeutige Werte betrachtet:

"TABLENAME"
"tablename"
"tableName"
"TableName"

Würden diese Bezeichner verwendet, um Objekte des gleichen Typs (z. B. Tabellen) zu erstellen, würde dies zur Erstellung von vier verschiedenen Objekten führen.

Tools von Drittanbietern und Bezeichnerauflösung unter Berücksichtigung der Groß-/Kleinschreibung

Einige Drittanbieteranwendungen verwenden immer doppelte Anführungszeichen für Bezeichner in den von ihnen generierten SQL-Abfragen, was zu Abfragen mit Bezeichnern führen kann, die in Snowflake aufgrund von Unterschieden in der Groß-/Kleinschreibung nicht gefunden werden können.

Steuern der Groß-/Kleinschreibung mit dem Parameter QUOTED_IDENTIFIERS_IGNORE_CASE

Um dies zu verhindern, stellt Snowflake den Sitzungsparameter QUOTED_IDENTIFIERS_IGNORE_CASE zur Verfügung, der sicherstellt, dass alle alphabetischen Zeichen in Bezeichnern, die innerhalb der Sitzung erstellt wurden, in Großbuchstaben gespeichert werden, unabhängig davon, ob der Bezeichner in doppelten Anführungszeichen steht. Die Voreinstellung für den Parameter ist FALSE.

Um das Verhalten bei Bezeichnern mit doppelten Anführungszeichen, bei denen die Groß- und Kleinschreibung beachtet werden muss, zu ändern, setzen Sie den Parameter für die Sitzung auf TRUE. Danach werden alle alphabetischen Zeichen in Bezeichnern in Großbuchstaben gespeichert.

Mit anderen Worten, alle folgenden Varianten wären gleichwertig:

TABLENAME
tablename
tableName
TableName
"TABLENAME"
"tablename"
"tableName"
"TableName"

Beachten Sie, dass der Parameter keine der Einschränkungen beeinflusst, die für Bezeichner ohne Anführungszeichen hinsichtlich Zahlen, Sonderzeichen und Leerzeichen gelten.

Auswirkungen der Änderung des Parameters

Das Ändern des Sitzungsparameters QUOTED_IDENTIFIERS_IGNORE_CASE wirkt sich nur auf neue Objekte und Abfragen aus:

  • Wenn ein Objekt mit einem Bezeichner mit gemischter Groß- und Kleinschreibung in doppelten Anführungszeichen erstellt wird, speichert Snowflake bei der Standardeinstellung FALSE den Bezeichner mit gemischter Groß-/Kleinschreibung.

  • Wenn der Parameter dann in TRUE geändert wird, ist der Bezeichner für das neu erstellte Objekt nicht abrufbar/auflösbar.

Tipp

Aufgrund der Auswirkungen, die die Änderung des Parameters auf die Auflösung von Bezeichnern haben kann, empfehlen wir nachdrücklich, frühzeitig bei Ihrer Implementierung von Snowflake eine Bezeichnerauflösungsmethode zu wählen und dann das Standardverhalten festzulegen, indem Sie den Parameter auf der Kontoebene entsprechend einstellen. Dies kann von jedem Kontoadministrator für Ihr Konto durchgeführt werden. Der Parameter kann immer auf Sitzungsebene überschrieben werden, aber wir empfehlen, den Standardwert des Parameters nicht zu ändern, es sei denn, dies ist ausdrücklich erforderlich.

Die folgenden Beispiele veranschaulichen das Verhalten nach der Änderung des Parameters von FALSE in TRUE:

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "One" (i int);  -- stored as "One"

-- Create a table with an unquoted identifier
CREATE TABLE TWO(j int);     -- stored as "TWO"

-- These queries work
SELECT * FROM "One";         -- searches for "One"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"

-- These queries do not work
SELECT * FROM One;           -- searches for "ONE"
SELECT * FROM "Two";         -- searches for "Two"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- Create another table with a double-quoted identifier
CREATE TABLE "Three"(k int); -- stored as "THREE"

-- These queries work
SELECT * FROM "Two";         -- searches for "TWO"
SELECT * FROM two;           -- searched for "TWO"
SELECT * FROM "TWO";         -- searches for "TWO"
SELECT * FROM "Three";       -- searches for "THREE"
SELECT * FROM three;         -- searches for "THREE"

-- This query does not work now - "One" is not retrievable
SELECT * FROM "One";         -- searches for "ONE"

Wenn sich die Bezeichner für zwei Tabellen nur von Fall zu Fall unterscheiden, kann ein Bezeichner nach Änderung des Parameters in eine andere Tabelle aufgelöst werden:

-- Set the default behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = false;

-- Create a table with a double-quoted identifier
CREATE TABLE "Tab" (i int);  -- stored as "Tab"

-- Create a table with an unquoted identifier
CREATE TABLE TAB(j int);     -- stored as "TAB"

-- This query retrieves "Tab"
SELECT * FROM "Tab"          -- searches for "Tab"

-- Change to the all-uppercase behavior
ALTER SESSION SET QUOTED_IDENTIFIERS_IGNORE_CASE = true;

-- This query retrieves "TAB"
SELECT * FROM "Tab"          -- searches for "TAB"