Udostępnij za pośrednictwem


Czym różni się usługa Entity SQL od Transact-SQL

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 i exists podzapytania zostały uogólnione, aby umożliwić korzystanie ze wszystkich kolekcji.

    Podzapytanie jest jednym z rodzajów kolekcji. e1 in e2 i exists(e) to konstrukcje Entity SQL do wykonania tych operacji.

  • Operacje ustawiania, takie jak union, intersecti except, 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

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.

Zobacz także