Поделиться через


Отличия Entity SQL и Transact-SQL

В этом разделе описываются различия между Entity SQL и Transact-SQL:

Поддержка наследования и связей

Язык Entity SQL работает непосредственно с концептуальными схемами сущности и поддерживает такие функции модели EDM, как наследование и связи.

При работе с наследованием часто полезно выбрать экземпляры подтипа из коллекции экземпляров супертипа. Оператор oftype в языке Entity SQL (аналогичный oftype в последовательностях C#) обеспечивает эту возможность. Сведения об этом и других операторах см. в разделе Операторы работы с типами (язык Entity SQL).

Поддержка коллекций

В языке Entity SQL коллекции рассматриваются как сущности первого класса. Пример:

  • Выражения коллекций допускаются в предложении from.

  • Вложенные запросы in и exists были обобщены, чтобы разрешить любые коллекции.

    Вложенный запрос — один вид коллекции. e1 in e2 и exists(e) — конструкции языка Entity SQL для выполнения этих операций.

  • Операторы работы с наборами, такие как union, intersect и except, теперь работают с коллекциями.

  • Операции соединения с коллекциями.

Поддержка выражений

В языке Transact-SQL существуют вложенные запросы (таблицы) и выражения (строки и столбцы).

В целях поддержки коллекций и вложенных коллекций все элементы языка Entity SQL являются выражениями. В отличие от SQL язык Entity SQL допускает композицию — каждое выражение может быть использовано в любом месте. Результатом выражения запроса всегда является коллекция проецируемых типов, которая может быть использована везде, где разрешено выражение коллекции. Сведения о выражениях Transact-SQL, которые не поддерживаются в языке Entity SQL, см. в разделе Неподдерживаемые выражения (язык Entity SQL).

Допустимы все приведенные ниже запросы Entity SQL:

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

Единая обработка вложенных запросов

Из-за ориентированности на таблицы язык Transact-SQL выполняет контекстную интерпретацию вложенных запросов. Например, вложенный запрос в предложении from считается мультинабором (таблица). Тот же вложенный запрос в предложении select считается скалярным вложенным запросом. Аналогично вложенный запрос, используемый в левой части оператора in, считается скалярным вложенным запросом, а с правой стороны предполагается вложенный запрос мультинабора.

Эти различия устранены в языке Entity SQL. Выражение имеет единую интерпретацию, которая не зависит от контекста, в котором оно использовано. В языке Entity SQL все вложенные запросы считаются вложенными запросами мультинабора. Если из вложенного запроса необходимо получить скалярное значение, то в языке Entity SQL предоставляется оператор anyelement, который обращается к коллекции (в данном случае к вложенному запросу) и извлекает из нее одноэлементное значение.

Устранение неявных приведений для вложенных запросов

Побочный эффект единообразной обработки вложенных запросов — неявное преобразование вложенных запросов к скалярным значениям. В частности, в языке Transact-SQL мультинабор строк (с единственным полем) неявно преобразуется в скалярную величину, тип данных которой совпадает с типом данных поля.

Язык Entity SQL не поддерживает такое неявное приведение. В языке Entity SQL предусмотрены оператор ANYELEMENT, который извлекает одноэлементное значение из коллекции, и предложение select value, которое позволяет избежать появления круглых скобок, обозначающих строку, при формировании выражения запроса.

Выбранное значение: устранение неявной оболочки строк

Способ обработки результатов запроса в языке Transact-SQL не определен однозначно. Предложение SELECT во вложенном запросе Transact-SQL неявно создает оболочку строк вокруг элементов в предложении. Это означает, что нельзя создать коллекцию скалярных величин или объектов. Язык Transact-SQL обеспечивает неявное приведение между типом строки с одним полем и одноэлементным значением того же типа данных.

Язык Entity SQL предоставляет предложение select value, чтобы пропустить неявное построение строки. В предложении select value можно указать только один элемент. Если используется такое предложение, то вокруг элементов в предложении select не формируются круглые скобки, обозначающие строку, что позволяет получить коллекцию необходимой формы, например select value a.

Язык Entity SQL предоставляет также конструктор строк для создания произвольных строк. Предложение select принимает один или несколько элементов в проекции и возвращает запись данных с полями, например

select a, b, c

Левая корреляция и задание псевдонимов

В языке Transact-SQL выражения в данной области (отдельное предложение, такое как select или from) не могут ссылаться на выражения, определенные ранее в той же области. Некоторые диалекты SQL (в том числе Transact-SQL) поддерживают их ограниченные формы в предложении from.

Язык Entity SQL обобщает левые корреляции в предложении from и одинаково их обрабатывает. Выражения в предложении from могут содержать ссылки на более ранние определения (определения слева) в том же предложении без дополнительных синтаксических конструкций.

В языке Entity SQL также налагаются дополнительные ограничения на запросы, включающие предложения group by. Выражения в предложении select и предложении having таких запросов могут ссылаться на ключи group by только через псевдонимы. Следующая конструкция допустима в языке Transact-SQL, но не в языке Entity SQL.

select t.x + t.y from T as t group by t.x + t.y

На языке Entity SQL необходимо написать:

select k from T as t group by (t.x + t.y) as k

Ссылочные столбцы (свойства) таблиц (коллекций)

Все ссылочные столбцы в языке Entity SQL должны быть квалифицированы с псевдонимом таблицы. Следующая конструкция (предполагается, что a является допустимым столбцом таблицы T) допустима в Transact-SQL, но не в Entity SQL.

select a from T

Форма Entity SQL:

select t.a as A from T as t

Псевдонимы таблицы в предложении from необязательны. Имя таблицы используется как неявный псевдоним. В языке Entity SQL допустима также следующая форма:

select Tab.a from Tab

Перемещение по объектам

В языке Transact-SQL для ссылок на столбцы таблицы (строки) используется символ «.». В языке Entity SQL эта возможность расширена (заимствовано из языков программирования), чтобы обеспечить перемещение по свойствам объекта.

Например, если p — выражение типа Person, с помощью следующего синтаксиса Entity SQL можно ссылаться на город в его адресе.

p.Address.City 

Не поддерживается *

Язык Transact-SQL поддерживает использование синтаксиса * в качестве псевдонима для всей строки и уточненного синтаксиса * (t.*) в качестве шаблона для ее полей. Кроме того, в Transact-SQL разрешается специальное статистическое выражение count(*), включающее значения NULL.

Язык Entity SQL не поддерживает конструкцию *. Запросы на языке Transact-SQL в форме select * from T и select T1.* from T1, T2... могут быть переданы на языке Entity SQL как select value t from T as t и select value t1 from T1 as t1, T2 as t2... соответственно. Эти конструкции также обеспечивают наследование (заменяемость значений), в то время как варианты select * ограничены свойствами верхнего уровня объявленного типа.

Язык Entity SQL не поддерживает статистическую функцию count(*). Используйте вместо этого функцию count(0).

Изменения на предложение Group By

Язык Entity SQL поддерживает псевдонимы ключей group by. Выражения в предложении select и предложении having таких запросов должны ссылаться на ключи group by через псевдонимы. Например, синтаксическая конструкция Entity SQL:

select k1, count(t.a), sum(t.a)
from T as t
group by t.b + t.c as k1

...эквивалентна следующей конструкции Transact-SQL:

select b + c, count(*), sum(a) 
from T
group by b + c

Статистические функции на основе коллекций

Язык Entity SQL поддерживает два типа статистических функций.

Статистические функции на основе коллекций работают с коллекциями и возвращают результат статистической обработки. Они могут применяться в любом месте в запросе и не требуют предложения group by. Пример:

select t.a as a, count({1,2,3}) as b from T as t   

Язык Entity SQL также поддерживает статистические функции в стиле SQL. Пример:

select a, sum(t.b) from T as t group by t.a as a

Использование предложения ORDER BY

В языке Transact-SQL предложения ORDER BY могут быть указаны только в самом верхнем блоке инструкции SELECT .. FROM .. WHERE. В языке Entity SQL можно использовать вложенное выражение ORDER BY, которое может быть размещено в любом месте запроса, однако упорядочение во вложенном запросе не сохраняется.

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

Идентификаторы

В языке Transact-SQL при сравнении идентификаторов учитываются параметры сортировки текущей базы данных. В идентификаторах на языке Entity SQL никогда не учитывается регистр символов, но всегда учитываются диакритические знаки (т.е. в Entity SQL различаются символы с диакритическими знаками и без таковых; например, различаются символы «a» и «ấ»). В языке Entity SQL версии символов, которые выглядят одинаково, но относятся к различным кодовым страницам, рассматриваются как разные символы. Дополнительные сведения см. в разделе Входная кодировка (язык Entity SQL).

Функциональность Transact-SQL, недоступная в Entity SQL

Следующая функциональность Transact-SQL недоступна в языке Entity SQL.

  • DML
    В настоящее время язык Entity SQL не поддерживает инструкции DML (вставка, обновление, удаление).
  • DDL
    Текущая версия Entity SQL не поддерживает DDL.
  • Командное программирование
    Язык Entity SQL не поддерживает командное программирование в отличие от Transact-SQL. Используйте вместо этого языки программирования.
  • Функции группирования
    Язык Entity SQL пока не поддерживает функции группирования (например, CUBE, ROLLUP и GROUPING_SET).
  • Функции аналитики
    Язык Entity SQL не предоставляет (пока) поддержку функций аналитики.
  • Встроенные функции, операторы
    Язык Entity SQL поддерживает подмножество встроенных функций и операторов Transact-SQL. Вероятно, эти операторы и функции будут реализованы ведущими поставщиками хранилищ. Entity SQL использует специальные функции для хранилищ, объявленные в манифесте поставщика. Кроме того, модель EDM позволяет объявить встроенные и определяемые пользователем функции хранения для использования в Entity SQL.
  • Подсказки
    Язык Entity SQL не предоставляет механизм подсказок в запросах.

См. также

Основные понятия

Общие сведения о языке Entity SQL
Неподдерживаемые выражения (язык Entity SQL)