Unterschiede zwischen Entity SQL und Transact-SQL
In diesem Artikel werden die Unterschiede zwischen Entity SQL und Transact-SQL beschrieben.
Unterstützung von Vererbung und Beziehungen
Entity SQL verwendet direkt konzeptionelle Entitätsschemas und unterstützt Features konzeptioneller Modelle, wie Vererbung und Beziehungen.
Bei der Vererbung ist es häufig nützlich, Instanzen eines Untertyps aus einer Auflistung von Instanzen des Obertyps auszuwählen. Diese Funktion wird in Entity SQL vom oftype-Operator bereitgestellt, der oftype
in C#-Sequenzen entspricht.
Unterstützung von Auflistungen
Entity SQL behandelt Auflistungen als Entitäten erster Klasse. Beispiel:
In einer
from
-Klausel sind Auflistungsausdrücke gültig.in
undexists
-Unterabfragen wurden so verallgemeinert, dass sämtliche Auflistungen zulässig sind.Eine Unterabfrage ist eine Art von Auflistung.
e1 in e2
undexists(e)
sind die Entity SQL-Konstrukte zum Ausführen dieser Operationen.Mengenoperationen, z. B.
union
,intersect
undexcept
, verarbeiten nun Auflistungen.Joins verarbeiten Auflistungen.
Unterstützung von Ausdrücken
Transact-SQL verfügt über Unterabfragen (Tabellen) und Ausdrücke (Zeilen und Spalten).
Zur Unterstützung von Auflistungen und geschachtelten Auflistungen behandelt Entity SQL alles als Ausdruck. Entity SQL ist zusammensetzbarer als Transact-SQL, d. h., jeder Ausdruck kann überall verwendet werden. Abfrageausdrücke geben stets Auflistungen der projizierten Typen zurück und können immer verwendet werden, wenn ein Auflistungsausdruck zulässig ist. Informationen zu Transact-SQL-Ausdrücken, die in Entity SQL nicht unterstützt werden, finden Sie unter Nicht unterstützte Ausdrücke.
Bei den folgenden Abfragen handelt es sich um gültige Entity SQL-Abfragen:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Einheitliche Behandlung von Unterabfragen
Da bei Transact-SQL der Schwerpunkt auf Tabellen liegt, werden Unterabfragen in ihrem Kontext interpretiert. Beispielsweise wird eine Unterabfrage in der from
-Klausel als Multimengentyp (Tabelle) aufgefasst. Dieselbe Unterabfrage in der select
-Klausel wird hingegen als skalare Unterabfrage aufgefasst. In ähnlicher Weise wird eine auf der linken Seite eines in
-Operators verwendete Unterabfrage als skalare Unterabfrage, die rechte Seite hingegen als Unterabfrage vom Multimengentyp aufgefasst.
In Entity SQL existieren diese Unterschiede nicht. Ein Ausdruck verfügt über eine einheitliche vom Kontext unabhängige Auslegung. Entity SQL betrachtet alle Unterabfragen als Multimengenabfragen. Für den Fall, dass aus einer Unterabfrage ein skalarer Wert benötigt wird, stellt Entity SQL den anyelement
-Operator bereit, der eine Auflistung (in diesem Fall die Unterabfrage) bearbeitet und einen Singleton-Wert aus der Auflistung zurückgibt.
Vermeiden impliziter Koersionen für Unterabfragen
Ein Nebeneffekt der einheitlichen Behandlung von Unterabfragen ist die implizite Konvertierung von Unterabfragen zu skalaren Werten. In Transact-SQL wird eine Multimenge von Zeilen (mit einem einzelnen Feld) implizit in einen skalaren Wert konvertiert, dessen Datentyp mit dem des Felds übereinstimmt.
Entity SQL unterstützt diese implizite Umwandlung nicht. Entity SQL stellt den ANYELEMENT
-Operator zum Extrahieren eines Singleton-Werts aus einer Auflistung bereit sowie eine select value
-Klausel zur Vermeidung der Erstellung eines Zeilenwrappers während eines Abfrageausdrucks.
Select Value: Vermeiden des impliziten Zeilen-Wrappers
Die Select-Klausel in einer Transact-SQL-Unterabfrage erstellt implizit einen Zeilenwrapper für die Elemente in der Klausel. Dies bedeutet, dass keine Auflistungen von Skalaren oder Objekten erstellt werden können. Transact-SQL lässt eine implizite Umwandlung eines rowtype
mit einem Feld zu einem Singleton-Wert des gleichen Datentyps zu.
Entity SQL bietet die select value
-Klausel, um die implizite Zeilenkonstruktion unnötig zu machen. In einer select value
-Klausel kann nur ein Element angegeben werden. Bei Verwendung dieser Klausel wird kein Zeilenwrapper für die Elemente in der select
-Klausel erstellt, und eine Auflistung der gewünschten Form kann erstellt werden. Beispiel: select value a
.
Entity SQL stellt auch den Zeilenkonstruktor zum Erstellen beliebiger Zeilen bereit. Mit select
werden ein oder mehrere Elemente in der Projektion übergeben, und das Ergebnis ist ein Datensatz mit Feldern:
select a, b, c
Linkskorrelation und Aliasing
In Transact-SQL können Ausdrücke in einem bestimmten Bereich (eine einzelne Klausel wie select
oder from
) nicht auf Ausdrücke verweisen, die vorher im selben Bereich definiert wurden. Einige Dialekte von SQL (einschließlich Transact-SQL) unterstützen sie in der from
-Klausel in beschränktem Umfang.
Entity SQL verallgemeinert Linkskorrelationen in der from
-Klausel und behandelt sie einheitlich. Ausdrücke in der from
-Klausel können ohne die Verwendung zusätzlicher Syntax auf vorherige Definitionen (Definitionen auf der linken Seite) in derselben Klausel verweisen.
Entity SQL schränkt auch Abfragen, die group by
-Klauseln enthalten, weiter ein. Ausdrücke in der select
-Klausel und der having
-Klausel solcher Abfragen können nur mithilfe ihrer Aliase auf die group by
-Schlüssel verweisen. Das folgende Konstrukt ist in Transact-SQL gültig, jedoch nicht in Entity SQL:
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
So führen Sie dies in Entity SQL aus
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
Verweisen auf Spalten (Eigenschaften) von Tabellen (Auflistungen)
Alle Spaltenverweise in Entity SQL müssen mit dem Tabellenalias qualifiziert werden. Das folgende Konstrukt (das voraussetzt, dass a
eine gültige Spalte der Tabelle T
ist) ist in Transact-SQL gültig, jedoch nicht in Entity SQL.
SELECT a FROM T
In Entity SQL:
SELECT t.a AS A FROM T AS t
Die Tabellenaliase sind in der from
-Klausel optional. Der Name der Tabelle wird als implizites Alias verwendet. Entity SQL lässt auch die folgende Form zu:
SELECT Tab.a FROM Tab
Navigieren durch Objekte
Transact-SQL verwendet die Punktnotation (.) für Verweise auf Spalten (von Zeilen) einer Tabelle. Entity SQL erweitert diese Notation (wie in Programmiersprachen), um die Navigation durch Eigenschaften eines Objekts zu unterstützen.
Wenn z. B. p
ein Ausdruck vom Typ „Person“ ist, lautet die Entity SQL-Syntax zum Verweisen auf die Stadt und die Adresse dieser Person wie folgt.
p.Address.City
Keine Unterstützung von *
Transact-SQL unterstützt die nicht qualifizierte *-Syntax als Alias für die gesamte Zeile und die qualifizierte *-Syntax („t.*“) als Abkürzung für die Felder dieser Tabelle. Außerdem ermöglicht Transact-SQL ein besonderes count(*)-Aggregat, das NULL-Werte einschließt.
Entity SQL unterstützt das *-Konstrukt nicht. Transact-SQL-Abfragen der Form select * from T
und select T1.* from T1, T2...
können in Entity SQL mit select value t from T as t
bzw. select value t1 from T1 as t1, T2 as t2...
ausgedrückt werden. Außerdem behandeln diese Konstrukte Vererbung (Wertersetzbarkeit), während die select *
-Varianten auf die Eigenschaften des deklarierten Typen auf oberster Ebene eingeschränkt sind.
Entity SQL unterstützt das count(*)
-Aggregat nicht. Verwenden Sie stattdessen count(0)
.
Änderungen an "Group By"
Entity SQL unterstützt Aliase von group by
-Schlüsseln. Ausdrücke in der select
-Klausel und der having
-Klausel müssen mithilfe dieser Aliase auf die group by
-Schlüssel verweisen. Dieses Beispiel einer Entity SQL-Syntax:
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... entspricht der folgenden Transact-SQL-Syntax:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Auflistungsbasierte Aggregate
Entity SQL unterstützt zwei Typen von Aggregaten.
Auflistungsbasierte Aggregate verarbeiten Auflistungen und erstellen das aggregierte Ergebnis. Sie können überall in der Abfrage stehen und erfordern keine group by
-Klausel. Beispiel:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Entity SQL unterstützt auch Aggregate im SQL-Format. Beispiel:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Verwendung der "ORDER BY"-Klausel
In Transact-SQL können ORDER BY
-Klauseln nur im obersten SELECT .. FROM .. WHERE
-Block angegeben werden. In Entity SQL können ORDER BY
-Ausdrücke geschachtelt und überall in der Abfrage platziert werden. Die Reihenfolge in einer geschachtelten Abfrage wird jedoch nicht beibehalten.
-- The following query will order the results by the last name
SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact AS C1
ORDER BY C1.LastName
-- In the following query ordering of the nested query is ignored.
SELECT C2.FirstName, C2.LastName
FROM (SELECT C1.FirstName, C1.LastName
FROM AdventureWorks.Contact as C1
ORDER BY C1.LastName) as C2
Bezeichner
In Transact-SQL basiert der Bezeichnervergleich auf der Sortierung der aktuellen Datenbank. In Entity SQL wird bei Bezeichnern nicht die Groß-/Kleinschreibung berücksichtigt, Akzentzeichen werden dagegen von den keinen Akzent tragenden Zeichen unterschieden (Entity SQL unterscheidet also beispielsweise zwischen „a“ und „ấ“). Entity SQL behandelt Buchstaben, die gleich erscheinen, aber aus unterschiedlichen Codepages stammen, als verschieden. Weitere Informationen finden Sie unter Eingabezeichensätze.
Transact-SQL-Funktionalität ist in Entity SQL nicht verfügbar
Die folgende Transact-SQL-Funktionalität ist in Entity SQL nicht verfügbar.
DML
Entity SQL stellt bisher keine Unterstützung für DML-Anweisungen (Einfügen, Aktualisieren, Löschen) bereit.
DDL
Entity SQL stellt in der aktuellen Version keine Unterstützung für DDL bereit.
Imperative Programmierung
Entity SQL bietet im Gegensatz zu Transact-SQL keine Unterstützung für die imperative Programmierung. Stattdessen sollte eine Programmiersprache verwendet werden.
Gruppierungsfunktionen
Entity SQL unterstützt bisher keine Gruppierungsfunktionen wie CUBE, ROLLUP und GROUPING_SET.
Analysefunktionen
Entity SQL unterstützt (bisher) keine analytischen Funktionen.
Integrierte Funktionen, Operatoren
Entity SQL unterstützt nur eine Teilmenge der in Transact-SQL enthaltenen Funktionen und Operatoren. Diese Operatoren und Funktionen werden sehr wahrscheinlich von den großen Speicheranbietern unterstützt. Entity SQL verwendet die speicherspezifischen, in einem Anbietermanifest deklarierten Funktionen. Außerdem können mit Entity Framework vordefinierte und benutzerdefinierte Speicherfunktionen für die Verwendung in Entity SQL deklariert werden.
Hinweise
Entity SQL stellt keine Mechanismen für Abfragehinweise bereit.
Batchabfrageergebnisse
Entity SQL unterstützt keine Batchabfrageergebnisse. Folgendes ist z. B. in Transact-SQL gültig (als Batch gesendet):
SELECT * FROM products;
SELECT * FROM categories;
Die äquivalente Anweisung wird in Entity SQL jedoch nicht unterstützt:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Entity SQL unterstützt nur eine Ergebnisse liefernde Abfrageanweisung pro Befehl.