Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Artikel werden die Unterschiede zwischen Entity SQL und Transact-SQL beschrieben.
Unterstützung von Vererbung und Beziehungen
Entity SQL arbeitet direkt mit konzeptionellen Entitätsschemas zusammen und unterstützt konzeptionelle Modellfeatures wie Vererbung und Beziehungen.
Beim Arbeiten mit vererbung ist es häufig nützlich, Instanzen eines Untertyps aus einer Sammlung von Supertypinstanzen auszuwählen. Der Oftype-Operator in Entity SQL (ähnlich oftype in C#Sequences) stellt diese Funktion bereit.
Unterstützung für Sammlungen
Entitäts-SQL behandelt Sammlungen als Erstklassenentitäten. Beispiel:
In einer
from-Klausel sind Auflistungsausdrücke gültig.inundexists-Unterabfragen wurden so verallgemeinert, dass sämtliche Auflistungen zulässig sind.Eine Unterabfrage ist eine Art von Auflistung.
e1 in e2undexists(e)sind die Entitäts-SQL-Konstrukte, um diese Vorgänge auszuführen.Mengenoperationen, z. B.
union,intersectundexcept, verarbeiten nun Auflistungen.Joins verarbeiten Auflistungen.
Unterstützung von Ausdrücken
Transact-SQL enthält Unterabfragen (Tabellen) und Ausdrücke (Zeilen und Spalten).
Um Sammlungen und geschachtelte Auflistungen zu unterstützen, macht Entity SQL alles zu einem Ausdruck. Entity SQL ist mehr komponierbar als Transact-SQL – jeder Ausdruck kann überall verwendet werden. Abfrageausdrücke führen immer zu Auflistungen der projizierten Typen und können überall verwendet werden, wo 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".
Es folgen alle gültigen Entitäts-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
Angesichts der Betonung auf Tabellen führt Transact-SQL kontextbezogene Interpretationen von Unterabfragen durch. Beispielsweise wird eine Unterabfrage in der from Klausel als Multiset (Tabelle) betrachtet. Die gleiche Unterabfrage, die in der select Klausel verwendet wird, wird jedoch als skalare Unterabfrage betrachtet. Ebenso wird eine unterabfrage, die auf der linken Seite eines in Operators verwendet wird, als skalare Unterabfrage betrachtet, während die rechte Seite als Multiset-Unterabfrage erwartet wird.
Entität SQL beseitigt diese Unterschiede. Ein Ausdruck hat eine einheitliche Interpretation, die nicht vom Kontext abhängt, in dem er verwendet wird. Entity SQL betrachtet alle Unterabfragen als Mehrmengenunterabfragen. Wenn ein skalarer Wert aus der Unterabfrage gewünscht wird, bietet Entity SQL den anyelement-Operator an, der auf die Auflistung (in diesem Fall die Unterabfrage) angewendet wird und einen einzelnen Wert aus der Auflistung extrahiert.
Vermeiden impliziter Koersionen für Unterabfragen
Eine verwandte Nebenwirkung der einheitlichen Behandlung von Unterabfragen ist die implizite Umwandlung von Unterabfragen in skalare Werte. Insbesondere wird in Transact-SQL eine Mehrfachmenge von Zeilen (mit einem einzelnen Feld) implizit in einen skalaren Wert konvertiert, dessen Datentyp dies des Felds ist.
Entity SQL unterstützt diese implizite Koersion nicht. Entity SQL stellt den ANYELEMENT Operator zum Extrahieren eines Singletonwerts aus einer Auflistung und einer select value Klausel bereit, um das Erstellen eines Zeilenwrappers während eines Abfrageausdrucks zu vermeiden.
Select Value: Vermeiden des impliziten Zeilen-Wrappers
Die Auswahlklausel in einer Transact-SQL-Unterabfrage erstellt implizit einen Zeilenwrapper um die Elemente in der Klausel. Dies bedeutet, dass wir keine Sammlungen von Skalaren oder Objekten erstellen können. Transact-SQL ermöglicht eine implizite Koerzierung zwischen einem rowtype mit einem einzigen Feld und einem Singleton-Wert desselben Datentyps.
Entity SQL stellt die select value Klausel bereit, um die implizite Zeilenerstellung zu überspringen. In einer Klausel kann nur ein select value Element angegeben werden. Wenn eine solche Klausel verwendet wird, wird kein Zeilen-Wrapper um die Elemente in der select-Klausel erstellt, und es kann eine Auflistung der gewünschten Form produziert werden, zum Beispiel select value a.
Entität SQL stellt auch den Zeilenkonstruktor zum Erstellen beliebiger Zeilen bereit.
select übernimmt ein oder mehrere Elemente in der Projektion und führt zu einem 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 zuvor im selben Bereich definiert wurden. Einige Dialekte von SQL (einschließlich Transact-SQL) unterstützen eingeschränkte Formen davon in der from Klausel.
Entity SQL generalisiert linke Korrelationen in der from Klausel und behandelt sie gleichmäßig. Ausdrücke in der from Klausel können in derselben Klausel auf frühere Definitionen (Definitionen links) verweisen, ohne dass zusätzliche Syntax erforderlich ist.
Entitäts-SQL erzwingt auch Einschränkungen für Abfragen, die group by Klauseln umfassen. Ausdrücke in der select Klausel und having Klausel solcher Abfragen können nur über ihre Aliase auf die group by Schlüssel verweisen. Das folgende Konstrukt ist in Transact-SQL gültig, aber nicht in Entity SQL:
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Gehen Sie dazu in Entity SQL wie folgt vor:
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 es a sich um eine gültige Spalte der Tabelle Thandelt) ist in Transact-SQL, aber nicht in Entity SQL gültig.
SELECT a FROM T
Das Sql-Entitätsformular ist
SELECT t.a AS A FROM T AS t
Die Tabellenaliasen sind in der from Klausel optional. Der Name der Tabelle wird als impliziter Alias verwendet. Entitäts-SQL lässt auch das folgende Formular zu:
SELECT Tab.a FROM Tab
Navigation durch Objekte
Transact-SQL verwendet die Schreibweise "." für das Verweisen auf Spalten (einer Zeile) einer Tabelle. Entity SQL erweitert diese Notation (aus Programmiersprachen ausgeliehen), um die Navigation über 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
Kein Support für *
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. Darüber hinaus ermöglicht Transact-SQL ein spezielles Count(*)-Aggregat, das NULL-Werte enthält.
Die Entität 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 als select value t from T as t bzw. select value t1 from T1 as t1, T2 as t2... ausgedrückt werden. Darüber hinaus behandeln diese Konstrukte die Vererbung (Wertsubstituierbarkeit), während die select * Varianten auf eigenschaften der obersten Ebene des deklarierten Typs beschränkt sind.
Die Entität SQL unterstützt das count(*) Aggregat nicht. 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 having Klausel müssen über diese Aliase auf die group by Schlüssel verweisen. Beispiel: Diese 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:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Auflistungsbasierte Aggregate
Entity SQL unterstützt zwei Arten von Aggregaten.
Sammlungsbasierte Aggregationen werden auf Sammlungen ausgeführt und erzeugen das aggregierte Ergebnis. Diese können an beliebiger Stelle in der Abfrage auftreten und erfordern keine group by-Klausel. Beispiel:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Entitäts-SQL unterstützt auch SQL-Aggregate im SQL-Stil. Beispiel:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Verwendung der "ORDER BY"-Klausel
Transact-SQL lässt zu, dass ORDER BY Klauseln nur im obersten SELECT .. FROM .. WHERE Block angegeben werden. In Entity SQL können Sie einen geschachtelten ORDER BY Ausdruck verwenden, der an beliebiger Stelle in der Abfrage platziert werden kann, jedoch wird die Reihenfolge in einer geschachtelten Abfrage 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 Versionen von Buchstaben, die identisch angezeigt werden, aber von verschiedenen Codeseiten als unterschiedliche Zeichen stammen. Weitere Informationen finden Sie unter Eingabezeichensatz.
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 bietet derzeit keine Unterstützung für DML-Anweisungen (Einfügen, Aktualisieren, Löschen).
DDL
Entity SQL bietet keine Unterstützung für DDL in der aktuellen Version.
Imperative Programmierung
Entity SQL bietet keine Unterstützung für die imperative Programmierung, im Gegensatz zu Transact-SQL. Verwenden Sie stattdessen eine Programmiersprache.
Gruppierungsfunktionen
Entity SQL bietet noch keine Unterstützung für Gruppierungsfunktionen (z. B. CUBE, ROLLUP und GROUPING_SET).
Analysefunktionen
Entity SQL bietet (noch) keine Unterstützung für Analysefunktionen.
Integrierte Funktionen, Operatoren
Entity SQL unterstützt eine Teilmenge der integrierten Funktionen und Operatoren von Transact-SQL. Diese Operatoren und Funktionen werden wahrscheinlich von den wichtigsten Store-Anbietern unterstützt. Entität SQL verwendet die in einem Anbietermanifest deklarierten speicherspezifischen Funktionen. Darüber hinaus können Sie im Entity Framework integrierte und benutzerdefinierte Speicherfunktionen deklarieren, damit Entity SQL verwendet werden kann.
Hinweise
Entity SQL stellt keine Mechanismen für Abfragehinweise bereit.
Abfrageergebnisse in Batches verarbeiten
Entity SQL unterstützt keine Batchverarbeitungsabfrageergebnisse. Beispielsweise ist Folgendes gültig Transact-SQL (Versenden in der Batch-Form):
SELECT * FROM products;
SELECT * FROM categories;
Die entsprechende Entität SQL wird jedoch nicht unterstützt:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Entity SQL unterstützt nur eine Abfrageanweisungen zur Ergebniserzeugung pro Befehl.