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 Features konzeptioneller Modelle, wie Vererbung und Beziehungen.

Bei der Vererbung ist oft empfehlenswert, 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 und exists-Unterabfragen wurden so verallgemeinert, dass sämtliche Auflistungen zulässig sind.

    Eine Unterabfrage ist eine Art von Auflistung. e1 in e2 und exists(e) sind die Entity SQL -Konstrukte zum Ausführen dieser Operationen.

  • 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).

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 ü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. 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 Feldes ü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 Zeilen-Wrappers während eines Abfrageausdrucks.

Select Value: Vermeiden des impliziten Zeilen-Wrappers

Die Select-Klausel in einer Transact-SQL -Unterabfrage erstellt implizit einen Zeilen-Wrapper 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 Singletonwert des gleichen 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. 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 folgenden 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 , 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 (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

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 implizites Alias verwendet. Entity SQL lässt auch das folgende Formular zu:

select Tab.a from Tab

Transact-SQL verwendet die "."-Schreibweise zum Verweisen auf Spalten (Zeilen) einer Tabelle. Entity SQL erweitert diese Schreibweise (wie 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 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 unterstützt nicht das *-Konstrukt. Transact-SQL -Abfragen der Formulare select * from T und select T1.* from T1, T2... können in Entity SQL als select value t from T as t und 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 nicht die count(*)-Aggregate. 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

...entspricht folgender Transact-SQL :

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 basiert der Bezeichnervergleich auf der Sortierreihenfolge der aktuellen Datenbank. In Entity SQL wird bei Bezeichnern nicht zwischen Groß-/Kleinschreibung unterschieden, 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 von verschiedenen Codepages stammen, als unterschiedliche Zeichen. 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.
  • Integrierte Funktionen, Operatoren
    Entity SQL unterstützt eine Untermenge der vordefinierten Funktionen und Operatoren von Transact-SQL . 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 in 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 catagories;

Siehe auch

Konzepte

Übersicht über Entity SQL
Nicht unterstützte Ausdrücke (Entity SQL)