Bezeichner (Entity SQL)
Bezeichner werden in Entity SQL zur Darstellung von Aliasen für Abfrageausdrücke, Variablenverweisen, Eigenschaften von Objekten, Funktionen usw. verwendet. Entity SQL bietet zwei Arten von Bezeichnern: einfache Bezeichner und Bezeichner in Anführungszeichen.
Einfacher Bezeichner
Ein einfacher Bezeichner in Entity SQL ist eine Sequenz von alphanumerischen Zeichen und Unterstrichen. Das erste Zeichen des Bezeichners muss ein alphabetisches Zeichen (a-z oder A-Z) sein.
Bezeichner in Anführungszeichen
Ein Bezeichner in Anführungszeichen ist eine beliebige Sequenz von in eckige Klammern ([]) eingeschlossenen Zeichen. Mit Bezeichnern in Anführungszeichen können Bezeichner mit Zeichen festgelegt werden, die in gewöhnlichen Bezeichnern nicht zulässig sind. Alle Zeichen innerhalb der eckigen Klammern sind Teil des Bezeichners, einschließlich aller Leerstellen.
Folgende Zeichen dürfen in einem Bezeichner in Anführungszeichen nicht enthalten sein:
Zeilenumbruch
Wagenrücklauf
Tabulator
Rücktaste
Zusätzliche eckige Klammern (d. h. eckige Klammern innerhalb der eckigen Klammern, die den Bezeichner umschließen)
Ein Bezeichner in Anführungszeichen kann Unicode-Zeichen enthalten.
Durch Bezeichner in Anführungszeichen können Sie Eigenschaftennamen mit Zeichen erstellen, die in Bezeichnern nicht zulässig sind, wie im folgenden Beispiel verdeutlicht wird:
SELECT c.ContactName AS [Contact Name] FROM customers AS c
Sie können auch Bezeichner in Anführungszeichen verwenden, um einen Bezeichner anzugeben, der einem reservierten Schlüsselwort von Entity SQL entspricht. Wenn beispielsweise der Typ Email über eine Eigenschaft mit dem Namen "From" verfügt, können Sie diese vom reservierten Schlüsselwort FROM durch die Verwendung von eckigen Klammern wie folgt unterscheiden:
SELECT e.[From] FROM emails AS e
Ein Bezeichner in Anführungszeichen kann auf der rechten Seite eines Punktoperators (.) verwendet werden.
SELECT t FROM ts as t WHERE t.[property] == 2
Um eine eckige Klammer in einem Bezeichner zu verwenden, fügen Sie eine zusätzliche eckige Klammer hinzu. Im folgenden Beispiel ist "abc]
" der Bezeichner:
SELECT t from ts as t WHERE t.[abc]]] == 2
Informationen zur Vergleichssemantik von Bezeichnern in Anführungszeichen finden Sie unter Eingabezeichensatz (Entity SQL).
Regeln für das Aliasing
Es wird empfohlen, wenn notwendig, Aliase in Entity SQL-Abfragen anzugeben, einschließlich der folgenden Entity SQL-Konstrukte:
Felder eines Zeilenkonstruktors.
Elemente in der FROM-Klausel eines Abfrageausdrucks.
Elemente in der SELECT-Klausel eines Abfrageausdrucks.
Elemente in der GROUP BY-Klausel eines Abfrageausdrucks.
Gültige Aliase
Gültige Aliase in Entity SQL sind alle einfachen Bezeichner oder Bezeichner in Anführungszeichen.
Generierung von Aliasen
Wenn in einem Entity SQL-Abfrageausdruck kein Alias angegeben ist, generiert Entity SQL einen Alias anhand der folgenden einfachen Regeln:
Wenn es sich bei dem Abfrageausdruck (für den der Alias nicht angegeben wurde) um einen einfachen Bezeichner oder Bezeichner in Anführungszeichen handelt, wird dieser Bezeichner als Alias verwendet. Beispielsweise wird
ROW(a, [b])
zuROW(a AS a, [b] AS [b])
.Wenn es sich bei dem Abfrageausdruck um einen komplexeren Ausdruck handelt, die letzte Komponente dieses Abfrageausdrucks jedoch ein einfacher Bezeichner ist, wird dieser Bezeichner als Alias verwendet. Beispielsweise wird
ROW(a.a1, b.[b1])
zuROW(a.a1 AS a1, b.[b1] AS [b1])
.
Sie sollten implizites Aliasing vermeiden, wenn Sie den Aliasnamen später verwenden möchten. Wenn Aliase (implizit oder explizit) miteinander in Konflikt stehen oder im selben Gültigkeitsbereich wiederholt auftreten, kommt es zu einem Kompilierungsfehler. Eine impliziter Alias durchläuft die Kompilierung auch dann, wenn ein expliziter oder impliziter Alias desselben Namens vorhanden ist.
Implizite Aliase werden anhand von Benutzereingaben automatisch generiert. Beispielsweise generiert die folgende Codezeile "NAME" als Alias für beide Spalten, wodurch ein Konflikt entsteht.
SELECT product.NAME, person.NAME
Die folgende Codezeile, in der explizite Aliase verwendet werden, schlägt ebenfalls fehl. Der Fehler ist jedoch offensichtlicher beim Lesen des Codes.
SELECT 1 AS X, 2 AS X …
Bereichsregeln
In Entity SQL werden Bereichsregeln definiert, die festlegen, wann bestimmte Variablen in der Abfragesprache sichtbar sind. Mit einigen Ausdrücken oder Anweisungen werden neue Namen eingeführt. Die Bereichsregeln bestimmen, wo solche Namen verwendet werden können und wann oder wo eine neue Deklaration mit demselben Namen wie eine andere die vorherige übergehen kann.
Wenn Namen in einer Entity SQL-Abfrage definiert werden, gelten sie als in einem Gültigkeitsbereich definiert. Ein Gültigkeitsbereich deckt einen vollständigen Bereich der Abfrage ab. Für alle Ausdrücke oder Namensverweise innerhalb eines bestimmten Gültigkeitsbereichs sind Namen sichtbar, die innerhalb dieses Gültigkeitsbereichs definiert sind. Vor dem Beginn und nach dem Ende eines Gültigkeitsbereichs kann nicht auf Namen verwiesen werden, die innerhalb des Gültigkeitsbereichs definiert sind.
Gültigkeitsbereiche können geschachtelt werden. In Teilen von Entity SQL werden neue Gültigkeitsbereiche eingeführt, die vollständige Bereiche abdecken, und diese Bereiche können andere Entity SQL-Ausdrücke enthalten, die wiederum Gültigkeitsbereiche einführen. Wenn Gültigkeitsbereiche geschachtelt sind, kann auf Namen verwiesen werden, die im innersten Gültigkeitsbereich definiert sind, der den Verweis enthält. Außerdem kann auf alle Namen verwiesen werden, die in beliebigen äußeren Gültigkeitsbereichen definiert sind. Zwei beliebige Gültigkeitsbereiche, die innerhalb desselben Gültigkeitsbereichs definiert sind, werden als nebengeordnete Gültigkeitsbereiche bezeichnet. Es kann nicht auf Namen verwiesen werden, die innerhalb nebengeordneter Gültigkeitsbereiche definiert sind.
Wenn ein Name in einem inneren Gültigkeitsbereich mit einem Namen in einem äußeren Gültigkeitsbereich übereinstimmt, beziehen sich Verweise im inneren Gültigkeitsbereich oder in Gültigkeitsbereichen, die innerhalb dieses Gültigkeitsbereichs deklariert sind, ausschließlich auf den neu deklarierten Namen. Der Name im äußeren Gültigkeitsbereich ist nicht sichtbar.
Selbst innerhalb desselben Gültigkeitsbereichs kann auf Namen erst verwiesen werden, wenn diese definiert sind.
Globale Namen können als Teil der Ausführungsumgebung existieren. Dies kann Namen von permanenten Auflistungen oder Umgebungsvariablen einschließen. Damit ein Name global ist, muss dieser im äußersten Gültigkeitsbereich deklariert werden.
Parameter befinden sich nicht in einem Gültigkeitsbereich. Da Verweise auf Parameter eine spezielle Syntax einschließen, treten niemals Konflikte zwischen Namen von Parametern und anderen Namen in der Abfrage auf.
Abfrageausdrücke
Mit einem Entity SQL-Abfrageausdruck wird ein neuer Gültigkeitsbereich eingeführt. Namen, die in der FROM-Klausel definiert sind, werden im FROM-Gültigkeitsbereich in der Reihenfolge ihres Auftretens von links nach rechts eingeführt. In der Verknüpfungsliste können Ausdrücke auf Namen verweisen, die zuvor in der Liste definiert wurden. Öffentliche Eigenschaften (Felder usw.) von in der FROM-Klausel festgelegten Elementen werden dem FROM-Gültigkeitsbereich nicht hinzugefügt. Auf sie muss immer durch den aliasqualifizierten Namen verwiesen werden. Üblicherweise werden alle Teile des SELECT-Ausdrucks als innerhalb des FROM-Gültigkeitsbereichs angesehen.
Mit der GROUP BY-Klausel wird auch ein neuer nebengeordneter Gültigkeitsbereich eingeführt. Jede Gruppe kann über einen Gruppennamen verfügen, der auf die Auflistung der Elemente in der Gruppe verweist. Mit jedem Gruppierungsausdruck wird auch ein neuer Name im Gruppengültigkeitsbereich eingeführt. Darüber hinaus wird das Schachtelaggregat (bzw. die benannte Gruppe) ebenfalls dem Gültigkeitsbereich hinzugefügt. Die Gruppierungsausdrücke selbst befinden sich innerhalb des FROM-Gültigkeitsbereichs. Wenn jedoch eine GROUP BY-Klausel verwendet wird, werden die SELECT-Liste (Projektion), die HAVING-Klausel und die ORDER BY-Klausel als innerhalb des Gruppengültigkeitsbereichs und nicht des FROM-Gültigkeitsbereichs angesehen. Aggregate werden besonders behandelt, wie in der folgenden Aufzählung beschrieben wird.
Folgende weitere Hinweise gelten für Gültigkeitsbereiche:
Die SELECT-Liste kann der Reihe nach neue Namen im Gültigkeitsbereich einführen. Projektionsausdrücke auf der rechten Seite können auf Namen verweisen, die auf der linken Seite projiziert sind.
Die ORDER BY-Klausel kann auf Namen (Aliase) verweisen, die in der SELECT-Liste angegeben sind.
Die Reihenfolge der Auswertung von Klauseln innerhalb des SELECT-Ausdrucks bestimmt die Reihenfolge, in der Namen im Gültigkeitsbereich eingeführt werden. Die FROM-Klausel wird zuerst ausgewertet, gefolgt von der WHERE-Klausel, GROUP BY-Klausel, HAVING-Klausel, SELECT-Klausel und schließlich der ORDER BY-Klausel.
Aggregatbehandlung
Entity SQL unterstützt zwei Formen von Aggregaten: auflistungsbasierte Aggregate und gruppenbasierte Aggregate. Auflistungsbasierte Aggregate sind das bevorzugte Konstrukt in Entity SQL, und gruppenbasierte Aggregate werden für die SQL-Kompatibilität unterstützt.
Beim Auflösen eines Aggregats versucht Entity SQL zunächst, dieses als auflistungsbasiertes Aggregat zu behandeln. Wenn dies fehlschlägt, transformiert Entity SQL die Aggregateingabe in einen Verweis auf das Schachtelaggregat und versucht dann, diesen neuen Ausdruck aufzulösen, wie im folgenden Beispiel gezeigt wird.
AVG(t.c) becomes AVG(group..(t.c))
Siehe auch
Konzepte
Entity SQL-Referenz
Übersicht über Entity SQL
Eingabezeichensatz (Entity SQL)