Die Unterschiede zwischen Entity SQL und Transact-SQL
In diesem Thema 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 EDM-Features 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 dem oftype-Operator in C#-Sequenzen entspricht. Weitere Informationen über diesen und andere Typoperatoren finden Sie unter Typoperatoren (Entity SQL).
Unterstützung von Auflistungen
Entity SQL behandelt Auflistungen als Entitäten erster Klasse. Beispiel:
In einer from-Klausel sind Auflistungsausdrücke gültig.
in und exists-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 zur Durchführung dieser Vorgänge.Mengenoperationen, wie z. B. union, intersect und except, verarbeiten nun Auflistungen.
Verknüpfungen verarbeiten Auflistungen.
Unterstützung von Ausdrücken
Transact-SQL verfügt über Unterabfragen (Tabellen) und Ausdrücke (Zeilen und Spalten).
Um die Unterstützung von Auflistungen und geschachtelten Auflistungen zu ermöglichen, behandelt Entity SQL alles als Ausdruck. Im Gegensatz zu SQL ist Entity SQL zusammensetzbar, 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 über Transact-SQL-Ausdrücke, die nicht von Entity SQL unterstützt werden, finden Sie unter Nicht unterstützte Ausdrücke (Entity SQL).
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 multiset-Typ (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 multiset-Typ aufgefasst.
In Entity SQL existieren diese Unterschiede nicht. Ausdrücke werden einheitlich und unabhängig von ihrem Kontext interpretiert. In Entity SQL werden alle Unterabfragen als Unterabfragen vom multiset-Typ aufgefasst. 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 ein multiset von Zeilen (mit einem einzelnen Feld) implizit in einen skalaren Wert konvertiert, dessen Datentyp mit dem des Feldes übereinstimmt.
Entity SQL unterstützt diese implizite Koersion nicht. Entity SQL stellt den ANYELEMENT-Operator für das Extrahieren eines Singleton-Werts aus einer Auflistung sowie eine select value-Klausel bereit, die das Erstellen eines Zeilen-Wrappers in einem Abfrageausdruck überflüssig macht.
Select Value: Vermeiden des impliziten Zeilen-Wrappers
Die Behandlung des Ergebnisses einer Abfrage durch Transact-SQL ist mehrdeutig. Die Select-Klausel in einer Transact-SQL-Unterabfrage erstellt implizit einen Zeilen-Wrapper für die Elemente in der Klausel. Daher können keine Auflistungen von Skalaren oder Objekten erstellt werden. Transact-SQL lässt eine implizite Koersion zwischen einem Zeilentyp mit einem Feld und einem Singleton-Wert desselben Datentyps zu.
Entity SQL stellt die select value-Klausel bereit, um die implizite Zeilenkonstruktion unnötig zu machen. In einer select value-Klausel kann nur ein Element angegeben werden. Wenn diese Klausel verwendet wird, wird kein Zeilen-Wrapper für die Elemente in der select-Klausel erstellt, und eine Auflistung der gewünschten Form kann erstellt werden, beispielsweise select value a
.
Entity SQL stellt weiterhin den ROW-Konstruktor zur Verfügung, mit dem beliebige Zeilen erstellt werden können. select wählt mindestens ein Element in der Projektion aus und erstellt einen Datensatz, wie im Folgenden dargestellt:
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, jedoch nicht in Entity SQL gültig:
select t.x + t.y from T as t group by t.x + t.y
In Entity SQL ist Folgendes zu verwenden:
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 (vorausgesetzt, dass a
eine gültige Spalte der Tabelle T
ist) ist in Transact-SQL jedoch nicht in Entity SQL gültig.
select a from T
Die Form für Entity SQL lautet
select t.a as A from T as t
Die Tabellenaliase sind in der from-Klausel optional. Der Name der Tabelle wird als impliziter Alias verwendet. In Entity SQL ist auch die folgende Form zulässig:
select Tab.a from Tab
Navigieren durch Objekte
In Transact-SQL wird die "."-Notation für das Verweisen auf Spalten (einer Zeile) einer Tabelle verwendet. In Entity SQL wird diese Notation, die von Programmiersprachen stammt, um die Unterstützung der Navigation durch die Eigenschaften eines Objekts erweitert.
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 unqualifizierte *-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 Nullen einschließt.
Entity SQL bietet keine Unterstützung für das *-Konstrukt. Transact-SQL-Abfragen in der Form select * from T
und select T1.* from T1, T2...
können in Entity SQL als 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 bietet keine Unterstützung für das count(*)-Aggregat. Verwenden Sie stattdessen count(0).
Änderungen an "Group By"
Entity SQL unterstützt Aliasing 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. Beispielsweise ist die Entity SQL-Syntax
select k1, count(t.a), sum(t.a)
from T as t
group by t.b + t.c as k1
...äquivalent zur folgenden Transact-SQL-Syntax:
select b + c, count(*), sum(a)
from T
group by b + c
Auflistungsbasierte Aggregate
Entity SQL unterstützt zwei Arten 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 erhalten.
-- 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 wird der Vergleich von Bezeichnern anhand der Sortierung der aktuellen Datenbank durchgeführt. In Entity SQL müssen bei Bezeichnern stets die Groß-/Kleinschreibung sowie Akzente beachtet werden (Entity SQL unterscheidet also zwischen Zeichen mit und ohne Akzent; "a" ist demnach ungleich "ấ"). Entity SQL behandelt Versionen von Buchstaben, die gleich aussehen jedoch von unterschiedlichen Codepages stammen, als unterschiedliche Buchstaben. Weitere Informationen finden Sie unter Eingabezeichensatz (Entity SQL).
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 stellt im Gegensatz zu Transact-SQL keine Unterstützung für die imperative Programmierung bereit. Stattdessen sollte eine Programmiersprache verwendet werden.
- Gruppierungsfunktionen
Entity SQL unterstützt bisher keine Gruppierungsfunktionen wie CUBE, ROLLUP und GROUPING_SET.
- Analytische Funktionen
Entity SQL unterstützt (bisher) keine analytischen Funktionen.
- Vordefinierte Funktionen, Operatoren
Entity SQL unterstützt eine Untermenge der vordefinierten Funktionen und Operatoren von Transact-SQL. Diese Operatoren und Funktionen werden von den wichtigsten Speicheranbietern unterstützt. In Entity SQL werden die im Anbietermanifest deklarierten speicherspezifischen Funktionen verwendet. Außerdem können vordefinierte und benutzerdefinierte Speicherfunktionen für die Verwendung in Entity SQL im Entity Data Model deklariert werden.
- Hinweise
Entity SQL stellt keine Mechanismen für Abfragehinweise bereit.
Siehe auch
Konzepte
Übersicht über Entity SQL
Nicht unterstützte Ausdrücke (Entity SQL)