Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
Ez a cikk az Entity SQL és a Transact-SQL közötti különbségeket ismerteti.
Öröklés és kapcsolatok támogatása
Az Entity SQL közvetlenül fogalmi entitássémák használatával működik, és támogatja az olyan elméleti modellfunkciókat, mint az öröklés és a kapcsolatok.
Az öröklés használatakor gyakran hasznos, ha egy altípus példányait szupertípuspéldányok gyűjteményéből választja ki. Az Entity SQL oftype operátora (a C#-sorozatokhoz hasonlóan oftype ) biztosítja ezt a képességet.
Gyűjtemények támogatása
Az Entity SQL első osztályú entitásként kezeli a gyűjteményeket. Például:
A gyűjteménykifejezések egy
fromzáradékban érvényesek.inésexistsaz albekérdezéseket általánosítottuk, hogy bármilyen gyűjteményt engedélyezhessenek.Az allekérdezés egyfajta gyűjtemény.
e1 in e2ésexists(e)az entitás SQL-konstrukciói ezeknek a műveleteknek a végrehajtásához.Halmazműveletek, mint például
union,intersectésexcept, most már gyűjteményeken működnek.Az illesztések gyűjteményeken működnek.
Kifejezések támogatása
Transact-SQL lekérdezésekhez és kifejezésekhez használható, amelyek táblázatokra, sorokra és oszlopokra épülnek.
A gyűjtemények és a beágyazott gyűjtemények támogatásához az Entity SQL mindent kifejezéssé tesz. Az entity SQL több összeállítású, mint a Transact-SQL – minden kifejezés bárhol használható. A lekérdezési kifejezések mindig a kivetített típusok gyűjteményeit eredményezik, és bárhol használhatók, ahol egy gyűjteménykifejezés engedélyezve van. Az entity SQL-ben nem támogatott Transact-SQL kifejezésekről további információt a nem támogatott kifejezések című témakörben talál.
Az összes érvényes Entity SQL-lekérdezés a következő:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Al-lekérdezések egységes kezelése
A táblákra való összpontosítás miatt Transact-SQL az al lekérdezések környezetfüggő értelmezését végzi. A from záradékban található al-lekérdezés például többhalmaznak (táblázatnak) minősül. A select záradékban használt al-lekérdezés ugyanakkor skaláris al-lekérdezésnek minősül. Hasonlóképpen, az operátor bal oldalán in használt rész-lekérdezés skaláris rész-lekérdezésnek minősül, míg a jobb oldalon multihalmazos rész-lekérdezésnek kell lennie.
Az entity SQL kiküszöböli ezeket a különbségeket. Egy kifejezés egységes értelmezéssel rendelkezik, amely nem függ attól a környezettől, amelyben a kifejezést használják. Az Entity SQL az összes részlekérdezést multihalmazosnak tekinti. Ha egy skaláris értékre van szükség az al-lekérdezésből, az Entity SQL biztosítja a anyelement operátort, amely a gyűjteményen (ebben az esetben az al-lekérdezésen) működik, és egyetlen értéket nyer ki a gyűjteményből.
Implicit kényszerítések elkerülése albekérdezések esetén
Az aljegyzetek egységes kezelésének egyik kapcsolódó mellékhatása a részjegyzetek implicit átalakítása skaláris értékekké. A Transact-SQL-ben a sorok többhalmaza (egyetlen mezővel) implicit módon skaláris értékké alakul, amelynek adattípusa a mezőé.
Az entity SQL nem támogatja ezt az implicit kényszerítést. Az Entity SQL lehetővé teszi az ANYELEMENT operátor számára, hogy egyetlentonos értéket nyerjen ki egy gyűjteményből, valamint egy záradékot select value , amellyel elkerülhető a sorburkoló létrehozása a lekérdezési kifejezés során.
Érték kiválasztása: Az implicit sorburkoló elkerülése
A Transact-SQL alkérdésben lévő kijelölési záradék automatikusan létrehoz egy soros burkolót a záradék elemei köré. Ez azt jelenti, hogy nem hozhatunk létre skaláris vagy objektumgyűjteményeket. Transact-SQL lehetővé teszi az implicit kényszert egy rowtype adott mező és egy azonos adattípusú egyetlen érték között.
Az Entity SQL az select value implicit sorépítés kihagyására vonatkozó záradékot adja meg. Egy záradékban select value csak egy elem adható meg. Ilyen záradék használata esetén a záradék elemei select köré nem jön létre sorburkoló, és a kívánt alakzat gyűjteményét is létre lehet állítani, például select value a.
Az Entity SQL a sorkonstruktort is biztosítja tetszőleges sorok létrehozásához.
select egy vagy több elemet vesz fel a vetítésben, és egy adatrekordot eredményez mezőkkel:
select a, b, c
Bal korreláció és aliasolás
A Transact-SQL-ben az adott hatókörben lévő kifejezések (egy adott záradék hasonló select vagy from) nem hivatkoznak az ugyanabban a hatókörben korábban definiált kifejezésekre. Az SQL egyes dialektusai (beleértve a Transact-SQL) támogatják a záradék korlátozott formáit from .
Az Entity SQL általánosítja a from záradékban lévő bal korrelációkat, és egységesen kezeli őket. A záradékban lévő from kifejezések hivatkozhatnak ugyanazon záradék korábbi definícióira (bal oldali definíciókra) anélkül, hogy további szintaxisra van szükség.
Az Entity SQL további korlátozásokat is alkalmaz a záradékokat tartalmazó group by lekérdezésekre. Az ilyen lekérdezések záradékában és select záradékában szereplő having kifejezések csak az aliasaikon keresztül hivatkozhatnak a group by kulcsokra. A következő szerkezet érvényes a Transact-SQL-ban, de nem érvényesek az Entity SQL-ben:
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Ehhez az Entity SQL-ben:
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
Táblázatok (gyűjtemények) oszlopaira (tulajdonságaira) való hivatkozás
Az Entity SQL összes oszlophivatkozását a tábla aliasával kell minősíteni. Az alábbi szerkezet (feltételezve, hogy a a tábla Térvényes oszlopa) érvényes Transact-SQL, de az Entity SQL-ben nem.
SELECT a FROM T
Az entitás SQL-űrlapja
SELECT t.a AS A FROM T AS t
A tábla aliasai opcionálisak a from záradékban. A tábla neve implicit aliasként használatos. Az Entity SQL a következő űrlapot is lehetővé teszi:
SELECT Tab.a FROM Tab
Navigálás objektumokon keresztül
Transact-SQL a "." jelölést használja egy tábla (sor) oszlopainak hivatkozásához. Az Entity SQL kiterjeszti ezt a jelölést (programozási nyelvektől kölcsönzött), hogy támogassa az objektumok tulajdonságain keresztüli navigációt.
Ha például p egy Személy típusú kifejezés, akkor az alábbi entitás SQL-szintaxisa hivatkozik a személy címének városára.
p.Address.City
Nincs támogatás *
Transact-SQL támogatja a nem minősített * szintaxist a teljes sor aliasaként, a minősített * szintaxist (t.*) pedig a tábla mezőinek billentyűparancsaként. Emellett a Transact-SQL lehetővé teszi a speciális count(*) összesítést, amely null értékeket is tartalmaz.
Az entity SQL nem támogatja a * szerkezetet. Transact-SQL űrlap select * from T lekérdezései, és select T1.* from T1, T2... az Entity SQL-ben select value t from T as tselect value t1 from T1 as t1, T2 as t2...és az , illetve . Ezen kívül ezek a szerkezetek kezelik az öröklést (az értékhelyettesítést), míg a select * változatok a deklarált típus legfelső szintű tulajdonságaira korlátozódnak.
Az entity SQL nem támogatja az aggregátumot count(*) . A count(0) használható helyette.
A csoportosítási szempont módosításai
Az Entity SQL támogatja a kulcsok aliasolását group by . A select záradékban és having záradékban szereplő kifejezéseknek ezen aliasokon keresztül kell hivatkozniuk a group by kulcsokra. Ez az entitás SQL-szintaxisa például:
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... a következő Transact-SQL-nek felel meg:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
Collection-Based összesítések
Az Entity SQL kétféle aggregátumot támogat.
A gyűjteményalapú összesítések a gyűjteményeken működnek, és létrehoznak egy összesített eredményt. Ezek bárhol megjelenhetnek a lekérdezésben, és nem igényelnek záradékot group by . Például:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Az Entity SQL az SQL-stílusú összesítéseket is támogatja. Például:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
ORDER BY Záradék használata
Transact-SQL lehetővé teszi, hogy a záradékok csak a legfelső ORDER BY blokkban legyenek megadva. Az Entity SQL-ben beágyazott ORDER BY kifejezéseket használhat, és bárhol elhelyezhető a lekérdezésben, de a beágyazott lekérdezések sorrendje nem marad meg.
-- 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
Azonosítók
A Transact-SQL-ben az azonosítók összehasonlítása az aktuális adatbázis rendezésén alapul. Az Entity SQL-ben az azonosítók mindig érzéketlenek és ékezetérzékenyek (vagyis az Entity SQL megkülönbözteti az ékezetes és a nem ékezetes karaktereket, például az "a" nem egyenlő a "ấ" karakterrel). Az Entity SQL a betűk azonosnak tűnő, de különböző kódlapokról származó verzióit különböző karakterekként kezeli. További információ: Beviteli karakterkészlet.
Transact-SQL funkció nem érhető el az Entity SQL-ben
Az alábbi Transact-SQL funkció nem érhető el az Entity SQL-ben.
DML
Az Entity SQL jelenleg nem támogatja a DML-utasításokat (beszúrás, frissítés, törlés).
DDL
Az Entity SQL nem támogatja a DDL-t az aktuális verzióban.
Imperatív programozás
Az Entity SQL nem támogatja az imperatív programozást, ellentétben a Transact-SQL-lel. Használjon inkább programozási nyelvet.
Csoportosított függvények
Az entity SQL még nem támogatja a csoportosítási függvényeket (például KOCKA, ROLLUP és GROUPING_SET).
Analitikai függvények
Az entity SQL (még) nem nyújt támogatást az elemzési függvényekhez.
Beépített függvények, operátorok
Az Entity SQL a Transact-SQL beépített függvényeinek és operátorainak egy részét támogatja. Valószínűleg a nagyobb áruházszolgáltatók támogatják ezeket az operátorokat és függvényeket. Az Entity SQL a szolgáltatójegyzékben deklarált tárolóspecifikus függvényeket használja. Emellett az Entity Framework lehetővé teszi a beépített és a felhasználó által definiált meglévő tárolófüggvények deklarálását az Entity SQL használatához.
Útmutatások
Az entity SQL nem biztosít mechanizmusokat a lekérdezési tippekhez.
Lekérdezési eredmények kötegelése
Az Entity SQL nem támogatja a lekérdezési eredmények kötegelését. Az alábbiak például érvényes Transact-SQL (kötegként küldve):
SELECT * FROM products;
SELECT * FROM categories;
Az egyenértékű Entity SQL azonban nem támogatott:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Az Entity SQL parancsonként csak egy eredménytermelő lekérdezési utasítást támogat.