Udostępnij za pośrednictwem


Czym różni się język Transact-SQL od języka 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. Na przykład:

  • Wyrażenia kolekcji są prawidłowe w klauzuli from .

  • in i exists podzapytania zostały uogólnione, aby zezwolić na wszystkie kolekcje.

    Podzapytywanie to jeden rodzaj 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ń

Język Transact-SQL ma podzapytania (tabele) i wyrażenia (wiersze i kolumny).

Aby obsługiwać kolekcje i kolekcje zagnieżdżone, usługa Entity SQL sprawia, że wszystko jest wyrażeniem. 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 na temat wyrażeń Języka Transact-SQL, które nie są obsługiwane w języku 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, język 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 podzapytywanie używane po lewej stronie operatora jest uważane za podzapytywanie skalarne, podczas gdy prawa strona ma być podzapytaniem wielozestawowym in .

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 żądana jest wartość skalarna z podzapytania, usługa Entity SQL udostępnia anyelement operator, który działa w kolekcji (w tym przypadku podzapytywanie) i wyodrębnia pojedynczą wartość z kolekcji.

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. Jednostka SQL udostępnia ANYELEMENT operatorowi wyodrębnianie pojedynczej wartości z kolekcji oraz klauzulę select value w celu uniknięcia tworzenia otoki wierszy podczas wyrażenia zapytania.

Wybierz wartość: Unikanie niejawnej otoki wierszy

Klauzula select w podzapytaniu języka Transact-SQL niejawnie tworzy otokę wierszy wokół elementów w klauzuli . Oznacza to, że nie możemy tworzyć kolekcji skalarnych ani obiektów. Język Transact-SQL umożliwia niejawne przecięcie między rowtype jednym polem 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 otoka wierszy wokół elementów w select klauzuli, a kolekcja żą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 po lewej stronie 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 Języka 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 having klauzuli takich zapytań mogą odwoływać się tylko do group by kluczy za pośrednictwem ich aliasów. Poniższa konstrukcja jest prawidłowa w języku Transact-SQL, ale nie znajduje się w jednostce SQL:

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

Aby to zrobić w jednostce 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 języku Transact-SQL, ale nie w języku Entity 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

Język Transact-SQL używa notacji "." do odwoływania się do kolumn (wiersza) 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 *

Język Transact-SQL obsługuje niekwalifikowaną składnię * jako alias dla całego wiersza oraz kwalifikowaną składnię * (t.*) jako skrót dla pól tej tabeli. Ponadto język Transact-SQL umożliwia użycie specjalnej liczby(*) agregacji, która obejmuje wartości null.

Jednostka SQL nie obsługuje konstrukcji * . Zapytania języka Transact-SQL formularza select * from T i select T1.* from T1, T2... mogą być wyrażone odpowiednio w języku 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 (podtytuł wartości), podczas gdy select * warianty są ograniczone do właściwości najwyższego poziomu zadeklarowanego typu.

Jednostka SQL nie obsługuje agregacji count(*) . Użycie w zamian parametru count(0).

Zmiany w grupie według

Język Entity SQL obsługuje aliasy group by kluczy. Wyrażenia w klauzuli select i having klauzuli muszą odwoływać się do group by kluczy za pośrednictwem tych aliasów. Na przykład ta składnia SQL jednostki:

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 oparte na kolekcji

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 . Na 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. Na przykład:

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

Użycie klauzuli ORDER BY

Język 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  

Identifiers

W języku Transact-SQL porównanie identyfikatorów jest oparte na sortowaniu bieżącej bazy danych. W jednostce SQL identyfikatory są zawsze rozróżniane bez uwzględniania wielkości liter i akcentu (czyli w języku Entity SQL rozróżniane są znaki wyróżniające i nieprzychytowane, na przykład "a" nie jest równe 'ấ'). Jednostka SQL traktuje wersje liter, które są takie same, ale pochodzą z różnych stron kodu co różne znaki. Aby uzyskać więcej informacji, zobacz Wejściowy zestaw znaków.

Funkcje języka Transact-SQL niedostępne w jednostce SQL

Następujące funkcje języka 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 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 magazynu, które mają być używane przez jednostkę SQL.

Wskazówki
Jednostka SQL nie udostępnia mechanizmów wskazówek dotyczących zapytań.

Przetwarzanie wsadowe wyników zapytania
Usługa Entity SQL nie obsługuje dzielenia na partie wyników zapytań. Na przykład następujące polecenie jest prawidłowe w języku 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 też