Отличия 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)