Sdílet prostřednictvím


Jak se Entity SQL liší od Transact-SQL

Tento článek popisuje rozdíly mezi Entity SQL a Transact-SQL.

Podpora dědičnosti a relací

Entity SQL pracuje přímo se schématy koncepčních entit a podporuje koncepční funkce modelu, jako je dědičnost a vztahy.

Při práci s dědičností je často užitečné vybrat instance podtypu z kolekce instancí supertypu. Tuto funkci poskytuje operátor oftype v Entity SQL (podobně jako oftype v sekvencích jazyka C#).

Podpora kolekcí

Entity SQL považuje kolekce za entity první třídy. Například:

  • Výrazy kolekce jsou platné v klauzuli from .

  • in a exists poddotazy byly obecně nastavené tak, aby podporovaly všechny druhy kolekcí.

    Poddotaz je jedním druhem kolekce. e1 in e2 a exists(e) jsou konstrukty Entity SQL, které tyto operace provádějí.

  • Operace set, například union, intersecta except, nyní pracují s kolekcemi.

  • Spojení pracují s kolekcemi.

Podpora výrazů

Transact-SQL obsahuje poddotazy (tabulky) a výrazy (řádky a sloupce).

Kvůli podpoře kolekcí a vnořených kolekcí vytvoří Entity SQL všechno jako výraz. Entity SQL je více kompozibilní než Jazyk Transact-SQL – každý výraz lze použít kdekoli. Výrazy dotazů vždy vedou k kolekci projektovaných typů a dají se použít všude, kde je povolený výraz kolekce. Informace o výrazech Transact-SQL, které nejsou podporovány v Entity SQL, naleznete v tématu Nepodporované výrazy.

Všechny platné dotazy Entity SQL:

1+2 *3  
"abc"  
row(1 as a, 2 as b)  
{ 1, 3, 5}
e1 union all e2  
set(e1)  

Jednotné zacházení s poddotazy

Vzhledem k tomu, že se klade důraz na tabulky, Transact-SQL provádí kontextovou interpretaci poddotazů. Například poddotaz v from klauzuli se považuje za multiset (tabulku). Stejný poddotaz použitý v select klauzuli se ale považuje za skalární poddotaz. Podobně se poddotaz použitý na levé straně in operátoru považuje za skalární poddotaz, zatímco u pravé strany se očekává poddotaz s více sadami.

Entity SQL eliminuje tyto rozdíly. Výraz má jednotnou interpretaci, která nezávisí na kontextu, ve kterém se používá. Entity SQL považuje všechny poddotazy za poddotazy s více sadami. Pokud je skalární hodnota požadovaná z poddotazu, Entity SQL poskytuje anyelement operátor, který pracuje s kolekcí (v tomto případě poddotaz) a extrahuje jednotlivou hodnotu z kolekce.

Vyhnout se implicitnímu převodu u poddotazů

Související vedlejší účinek jednotného zpracování poddotazů je implicitní převod poddotazů na skalární hodnoty. Konkrétně v jazyce Transact-SQL je multiset řádků (s jedním polem) implicitně převeden na skalární hodnotu, jejíž datový typ je pole.

Entity SQL nepodporuje tento implicitní převod. Entity SQL poskytuje operátor ANYELEMENT, který slouží k extrakci jedné hodnoty z kolekce, a klauzuli select value, která zabraňuje vytvoření obalu řádku během dotazovacího výrazu.

Výběr hodnoty: Vyhněte se implicitnímu obalu řádku.

Klauzule select v poddotazu Transact-SQL implicitně vytvoří obálku řádku kolem položek v klauzuli. To znamená, že nemůžeme vytvářet kolekce skalárů nebo objektů. Transact-SQL umožňuje implicitní převod mezi rowtype s jedním polem a singulární hodnotou stejného datového typu.

Entity SQL poskytuje select value klauzuli pro přeskočení implicitní konstrukce řádků. V select value klauzuli může být zadána pouze jedna položka. Pokud se taková klauzule použije, kolem položek v klauzuli select není sestavena žádná obálka a například může být vytvořena kolekce požadovaného tvaru select value a.

Entity SQL také poskytuje konstruktor řádku pro vytvoření libovolných řádků. select přebírá jeden nebo více prvků v projekci a vede k datovému záznamu s poli:

select a, b, c

Levá korelace a aliasing

V transact-SQL výrazy v daném oboru (jedna klauzule jako select nebo from) nemohou odkazovat na výrazy definované dříve ve stejném oboru. Některé dialekty SQL (včetně Transact-SQL) podporují omezené formy těchto v klauzuli from .

Entity SQL generalizuje levé korelace v from klauzuli a zpracovává je jednotně. Výrazy v from klauzuli mohou odkazovat na dřívější definice (definice vlevo) ve stejné klauzuli bez nutnosti další syntaxe.

Entity SQL také ukládá další omezení pro dotazy zahrnující group by klauzule. Výrazy v select klauzuli a having klauzuli těchto dotazů můžou odkazovat pouze na group by klíče prostřednictvím jejich aliasů. Následující konstruktor je platný v Transact-SQL, ale není v Entity SQL:

SELECT t.x + t.y FROM T AS t group BY t.x + t.y

Postup v entity SQL:

SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k

Odkazování na sloupce (vlastnosti) tabulek (kolekcí)

Všechny odkazy na sloupce v Entity SQL musí být kvalifikované pomocí aliasu tabulky. Následující konstruktor (za předpokladu, že a je platným sloupcem tabulky T) je platný v Transact-SQL, ale ne v Entity SQL.

SELECT a FROM T

Formulář Entity SQL je

SELECT t.a AS A FROM T AS t

Aliasy tabulky jsou v from klauzuli volitelné. Název tabulky se používá jako implicitní alias. Entity SQL umožňuje také následující formulář:

SELECT Tab.a FROM Tab

Transact-SQL používá notaci ". pro odkazování na sloupce (řádku) tabulky. Entita SQL rozšiřuje tuto notaci (zapůjčenou z programovacích jazyků) a podporuje navigaci prostřednictvím vlastností objektu.

Pokud p je například výraz typu Person, následuje syntaxe Entity SQL pro odkazování na město této osoby.

p.Address.City

Žádná podpora pro *

Transact-SQL podporuje nekvalifikovanou syntaxi * jako alias pro celý řádek a kvalifikovanou syntaxi * (t.*) jako zkratku pro pole této tabulky. Kromě toho Transact-SQL umožňuje speciální agregát count(*), který zahrnuje nulové hodnoty.

Entity SQL nepodporuje konstruktor *. Transact-SQL dotazy formuláře select * from T a select T1.* from T1, T2... mohou být vyjádřeny v Entity SQL jako select value t from T as t a select value t1 from T1 as t1, T2 as t2...v uvedeném pořadí. Tyto konstrukce navíc zpracovávají dědičnost (nahrazení hodnoty), zatímco select * varianty jsou omezeny na vlastnosti nejvyšší úrovně deklarovaného typu.

Entity SQL nepodporuje agregaci count(*) . Místo toho použijte count(0).

Změny seskupit podle

Entity SQL podporuje aliasy group by klíčů. Výrazy v select klauzuli a having klauzuli musí odkazovat na group by klíče prostřednictvím těchto aliasů. Například tato syntaxe Entity SQL:

SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1

... je ekvivalentní následujícímu jazyku Transact-SQL:

SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c

agregace Collection-Based

Entity SQL podporuje dva druhy agregací.

Agregace založené na kolekcích pracují s kolekcemi a vytvářejí agregovaný výsledek. Ty se můžou objevit kdekoli v dotazu a nevyžadují klauzuli group by . Například:

SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t

Entity SQL také podporuje agregace ve stylu SQL. Například:

SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a

Použití klauzule ORDER BY

Transact-SQL umožňuje ORDER BY zadat klauzule pouze v nejvyšším SELECT .. FROM .. WHERE bloku. V Entity SQL můžete použít vnořený ORDER BY výraz a lze ho umístit kamkoli do dotazu, ale pořadí v vnořeném dotazu se nezachová.

-- 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  

Identifikátory

V jazyce Transact-SQL je porovnání identifikátorů založeno na kolaci aktuální databáze. V Entity SQL jsou identifikátory vždy nerozlišující velká a malá písmena a rozlišující diakritiku (to znamená, že Entity SQL rozlišuje mezi znaky s diakritikou a bez diakritiky; například "a" se nerovná "ấ"). Entity SQL zpracovává verze písmen, které se zobrazují stejně, ale jsou z různých znakových stránek jako různé znaky. Další informace naleznete v tématu Vstupní znaková sada.

funkce Transact-SQL nejsou k dispozici v Entity SQL

Následující funkce Transact-SQL nejsou v Entity SQL k dispozici.

DML
Entity SQL v současné době neposkytuje žádnou podporu příkazů DML (vložení, aktualizace, odstranění).

Datový Definiční Jazyk (DDL)
Entity SQL neposkytuje v aktuální verzi žádnou podporu DDL.

Imperativní programování
Entity SQL neposkytuje žádnou podporu imperativního programování, na rozdíl od jazyka Transact-SQL. Místo toho použijte programovací jazyk.

Seskupovací funkce
Entity SQL zatím neposkytuje podporu pro seskupovací funkce (například CUBE, ROLLUP a GROUPING_SET).

Analytické funkce
Entity SQL zatím neposkytuje podporu analytických funkcí.

Předdefinované funkce, operátory
Entity SQL podporuje podmnožinu integrovaných funkcí a operátorů jazyka Transact-SQL. Tyto operátory a funkce budou pravděpodobně podporovány hlavními poskytovateli obchodů. Entity SQL používá funkce specifické pro úložiště deklarované v manifestu zprostředkovatele. Kromě toho Entity Framework umožňuje deklarovat předdefinované a uživatelem definované existující funkce úložiště, aby entity SQL bylo možné použít.

Nápovědy
Entity SQL neposkytuje mechanismy pro nápovědy k dotazům.

Dávkování výsledků dotazu
Entity SQL nepodporuje dávkové výsledky dotazů. Například následující je platný Transact-SQL (posílání jako dávková operace):

SELECT * FROM products;
SELECT * FROM categories;

Ekvivalentní "Entity SQL" ale není podporován:

SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;

Entity SQL podporuje pouze jeden příkaz dotazu pro vytváření výsledků na jeden příkaz.

Viz také