Uwaga
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
W tym artykule opisano różnice między językami Entity SQL i Transact-SQL.
Obsługa dziedziczenia i relacji
Usługa Entity SQL współpracuje bezpośrednio ze schematami jednostek koncepcyjnych i obsługuje funkcje modelu koncepcyjnego, takie jak dziedziczenie i relacje.
Podczas pracy z dziedziczeniem często warto wybrać wystąpienia podtypu z kolekcji wystąpień supertypu. Operator oftype w języku Entity SQL (podobny do oftype
w sekwencjach języka C#) zapewnia tę funkcję.
Obsługa kolekcji
Jednostka SQL traktuje kolekcje jako jednostki pierwszej klasy. Przykład:
Wyrażenia kolekcji są prawidłowe w klauzuli
from
.in
iexists
podzapytania zostały uogólnione, aby umożliwić korzystanie ze wszystkich kolekcji.Podzapytanie jest jednym z rodzajów kolekcji.
e1 in e2
iexists(e)
to konstrukcje Entity SQL do wykonania tych operacji.Operacje ustawiania, takie jak
union
,intersect
iexcept
, działają teraz na kolekcjach.Sprzężenia działają na kolekcjach.
Obsługa wyrażeń
Transact-SQL ma podzapytania (z tabelami) i wyrażenia (z wierszami i kolumnami).
Aby obsługiwać kolekcje i kolekcje zagnieżdżone, język Entity SQL traktuje każdy element jako wyrażenie. Język Entity SQL jest bardziej komponowalny niż język Transact-SQL — każde wyrażenie może być używane w dowolnym miejscu. Wyrażenia zapytań zawsze powodują kolekcje przewidywanych typów i mogą być używane w dowolnym miejscu, w jakim jest dozwolone wyrażenie kolekcji. Aby uzyskać informacje o wyrażeniach Transact-SQL, które nie są obsługiwane w usłudze Entity SQL, zobacz Nieobsługiwane wyrażenia.
Poniżej przedstawiono wszystkie prawidłowe zapytania Entity SQL:
1+2 *3
"abc"
row(1 as a, 2 as b)
{ 1, 3, 5}
e1 union all e2
set(e1)
Jednolite traktowanie podzapytania
Biorąc pod uwagę jego nacisk na tabele, Transact-SQL wykonuje kontekstową interpretację podzapytania. Na przykład podzapytywanie w klauzuli from
jest uznawane za wielozestaw (tabela). Jednak to samo podzapytywanie używane w klauzuli select
jest uważane za podzapytywanie skalarne. Podobnie, podzapytanie używane po lewej stronie operatora in
jest uważane za podzapytanie skalarne, podczas gdy prawa strona ma być podzapytaniem multizbiorowym.
Język Entity SQL eliminuje te różnice. Wyrażenie ma jednolitą interpretację, która nie zależy od kontekstu, w którym jest używana. Usługa Entity SQL uwzględnia wszystkie podzapytania jako podzestawy. Jeśli z podzapytania jest wymagana wartość skalarna, Entity SQL udostępnia operator anyelement
, który działa na kolekcji (w tym przypadku podzapytanie) i ekstrahuje z niej pojedynczą wartość.
Unikanie niejawnych przymusów dla podzapytania
Powiązany efekt uboczny jednolitego traktowania podzapytania jest niejawną konwersją podzapytania na wartości skalarne. W szczególności w języku Transact-SQL wielozbiór wierszy (z pojedynczym polem) jest niejawnie konwertowany na wartość skalarną, której typem danych jest pole.
Język Entity SQL nie obsługuje tego niejawnego przymusu. Entity SQL udostępnia operator ANYELEMENT
do wyodrębnienia pojedynczej wartości z kolekcji oraz klauzulę select value
w celu uniknięcia tworzenia opakowania wiersza podczas wyrażenia zapytania.
Wybierz wartość: Unikając automatycznego otoczenia wiersza
Klauzula select w podzapytaniu Transact-SQL implicitnie tworzy zawijanie wierszy wokół składników w tej klauzuli. Oznacza to, że nie możemy tworzyć kolekcji skalarnych ani obiektów. Transact-SQL umożliwia niejawne dopasowanie między rowtype
, który ma jedno pole, a pojedynczą wartością tego samego typu danych.
Jednostka SQL zawiera klauzulę select value
pomijania niejawnej konstrukcji wierszy. W klauzuli select value
można określić tylko jeden element. Gdy taka klauzula jest używana, nie jest tworzona żadna otoczka wokół elementów klauzuli select
, a kolekcja pożądanego kształtu może zostać utworzona, na przykład select value a
.
Jednostka SQL udostępnia również konstruktor wierszy do konstruowania dowolnych wierszy.
select
przyjmuje co najmniej jeden element w projekcji i powoduje utworzenie rekordu danych z polami:
select a, b, c
Korelacja lewostronna i aliasowanie
W języku Transact-SQL wyrażenia w danym zakresie (pojedyncze klauzule takie jak select
lub from
) nie mogą odwoływać się do wyrażeń zdefiniowanych wcześniej w tym samym zakresie. Niektóre dialekty JĘZYKA SQL (w tym Transact-SQL) obsługują ograniczone formy tych w klauzuli from
.
Jednostka SQL uogólnia korelacje pozostawione w klauzuli from
i traktuje je równomiernie. Wyrażenia w from
klauzuli mogą odwoływać się do wcześniejszych definicji (definicji po lewej stronie) w tej samej klauzuli bez konieczności dodatkowej składni.
Jednostka SQL nakłada również dodatkowe ograniczenia dotyczące zapytań obejmujących group by
klauzule. Wyrażenia w klauzuli select
i klauzuli having
zapytań mogą odwoływać się tylko do kluczy group by
za pośrednictwem ich aliasów. Następująca konstrukcja jest prawidłowa w Transact-SQL, ale nie są w Entity SQL.
SELECT t.x + t.y FROM T AS t group BY t.x + t.y
Aby to zrobić w Entity SQL:
SELECT k FROM T AS t GROUP BY (t.x + t.y) AS k
Odwoływanie się do kolumn (właściwości) tabel (kolekcji)
Wszystkie odwołania do kolumn w jednostce SQL muszą być kwalifikowane za pomocą aliasu tabeli. Poniższa konstrukcja (przy założeniu, że a
jest prawidłową kolumną tabeli T
) jest prawidłowa w Transact-SQL, ale nie w jednostce SQL.
SELECT a FROM T
Formularz Entity SQL jest
SELECT t.a AS A FROM T AS t
Aliasy tabeli są opcjonalne w klauzuli from
. Nazwa tabeli jest używana jako alias niejawny. Język Entity SQL umożliwia również następującą formę:
SELECT Tab.a FROM Tab
Nawigacja za pośrednictwem obiektów
Transact-SQL używa notacji „.” do odwoływania się do kolumn wierszy tabeli. Język Entity SQL rozszerza tę notację (pożyczony z języków programowania), aby obsługiwać nawigację za pośrednictwem właściwości obiektu.
Jeśli na przykład p
jest wyrażeniem typu Person, poniżej znajduje się składnia Entity SQL do odwoływania się do miasta adresu tej osoby.
p.Address.City
Brak obsługi dla *
Transact-SQL obsługuje niekwalifikowaną składnię * jako alias dla całego wiersza, a kwalifikowana składnia * (t.*) jako skrót dla pól tej tabeli. Ponadto Transact-SQL umożliwia korzystanie ze specjalnej funkcji agregującej liczba(*), która uwzględnia wartości null.
Jednostka SQL nie obsługuje konstrukcji * . Transact-SQL zapytania w formie select * from T
i select T1.* from T1, T2...
mogą być wyrażone odpowiednio w Entity SQL jako select value t from T as t
i select value t1 from T1 as t1, T2 as t2...
. Ponadto te konstrukcje obsługują dziedziczenie (zamienność wartości), natomiast warianty select *
są ograniczone do właściwości najwyższego poziomu zadeklarowanego typu.
Jednostka SQL nie obsługuje agregacji count(*)
. Użyj count(0)
zamiast tego.
Zmiany w grupowaniu według
Język Entity SQL obsługuje aliasowanie kluczy group by
. Wyrażenia w klauzuli select
i w klauzuli having
muszą odwoływać się do kluczy group by
za pośrednictwem tych aliasów. Na przykład ta składnia Entity SQL:
SELECT k1, count(t.a), sum(t.a)
FROM T AS t
GROUP BY t.b + t.c AS k1
... jest odpowiednikiem następującego języka Transact-SQL:
SELECT b + c, count(*), sum(a)
FROM T
GROUP BY b + c
agregacje Collection-Based
Jednostka SQL obsługuje dwa rodzaje agregacji.
Agregacje oparte na kolekcji działają na kolekcjach i generują zagregowany wynik. Mogą one występować w dowolnym miejscu w zapytaniu i nie wymagają klauzuli group by
. Przykład:
SELECT t.a AS a, count({1,2,3}) AS b FROM T AS t
Usługa Entity SQL obsługuje również agregacje w stylu SQL. Przykład:
SELECT a, sum(t.b) FROM T AS t GROUP BY t.a AS a
Użycie klauzuli ORDER BY
Transact-SQL umożliwia ORDER BY
określenie klauzul tylko w najbardziej górnym SELECT .. FROM .. WHERE
bloku. W usłudze Entity SQL można użyć wyrażenia zagnieżdżonego i można go umieścić w dowolnym miejscu w zapytaniu, ale kolejność w zagnieżdżonym ORDER BY
zapytaniu nie jest zachowywana.
-- 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
Identyfikatory
W języku Transact-SQL porównanie identyfikatorów jest oparte na sortowaniu bieżącej bazy danych. W języku Entity SQL identyfikatory zawsze są rozróżniane bez uwzględniania wielkości liter, ale z uwzględnieniem akcentów (czyli Entity SQL odróżnia znaki z akcentami i bez akcentów; na przykład 'a' nie jest równe 'ấ'). Entity SQL traktuje wersje liter, które wyglądają tak samo, ale pochodzą z różnych kodowań, jako różne znaki. Aby uzyskać więcej informacji, zobacz Wejściowy zestaw znaków.
funkcja Transact-SQL niedostępna w jednostce SQL
Następujące funkcje Transact-SQL nie są dostępne w usłudze Entity SQL.
DML
Jednostka SQL obecnie nie obsługuje instrukcji DML (wstawianie, aktualizowanie, usuwanie).
DDL (Język Definicji Danych)
Język Entity SQL nie obsługuje języka DDL w bieżącej wersji.
Programowanie imperatywne
Język Entity SQL nie obsługuje programowania imperatywnego, w przeciwieństwie do języka Transact-SQL. Zamiast tego użyj języka programowania.
Funkcje grupowania
Jednostka SQL nie zapewnia jeszcze obsługi funkcji grupowania (na przykład CUBE, ROLLUP i GROUPING_SET).
Funkcje analityczne
Usługa Entity SQL nie zapewnia jeszcze () obsługi funkcji analitycznych.
Wbudowane funkcje, operatory
Język Entity SQL obsługuje podzbiór wbudowanych funkcji i operatorów języka Transact-SQL. Te operatory i funkcje mogą być obsługiwane przez głównych dostawców sklepów. Usługa Entity SQL używa funkcji specyficznych dla magazynu zadeklarowanych w manifeście dostawcy. Ponadto program Entity Framework umożliwia deklarowanie wbudowanych i zdefiniowanych przez użytkownika funkcji przechowywania, które mają być używane przez Entity SQL.
Wskazówki
Jednostka SQL nie udostępnia mechanizmów wskazówek dotyczących zapytań.
Grupowanie wyników zapytania
Usługa Entity SQL nie obsługuje dzielenia na partie wyników zapytań. Na przykład następujące informacje są prawidłowe Transact-SQL (wysyłanie jako partia):
SELECT * FROM products;
SELECT * FROM categories;
Jednak równoważna jednostka SQL nie jest obsługiwana:
SELECT value p FROM Products AS p;
SELECT value c FROM Categories AS c;
Jednostka SQL obsługuje tylko jedną instrukcję zapytania tworzącą wynik na polecenie.