-- Команда создания функции должна быть 1-ой в пакете команд, поэтому выполняем
-- принудительное завершение пакета с помощью команды go
GO
/*
Создаем функцию, которая возвращает значение типа TABLE – таблицу с полями по названию и типу, совпадающими с полями таблицы table1, которая вставляет в возвращаемую переменную @tt1 табличного типа все строки таблицы table1, значения столбца c2 в которых совпадает с аргументом @c2_val.
INSERT INTO @tt1 SELECT * FROM table1 WHERE c2 = @c2_val
-- Обязательно наличие ключевого слова return
RETURN
END
GO
Теперь выполним команды SELECT с использованием оператора объединения APPLY. Сначала – CROSS APPLY:
SELECT * FROM table1 AS t1 CROSS APPLY func1(t1.c2 + 1)
в результате чего получаем:
с1
с2
c3
с1
с2
с3
Если бы результаты этой команды нужно было бы перенести в таблицу, то это можно было бы сделать, используя вложенный запрос SELECT, следующим образом:
SELECT * INTO cross_apply FROM
(SELECT t1.*, t2.c1 AS cc1, t2.c2 AS cc2, t2.c3 AS cc3
FROM table1 AS t1 CROSS APPLY func1(t1.c2 + 1) AS t2) AS tt2
Следует отметить, что сложность написания вышерассмотренной команды заключается в том, что в результате нахождения объединения таблицы table1 и результатов работы функции func1 получается 3 пары полей с одинаковыми названиями, что не позволяет записать результат выполнения этого запроса в новую таблицу с помощью секции INTO внешней команды SELECT. Для разрешения конфликта имен приходится для каждого дублирующегося имени описывать синоним во вложенной команде SELECT.
Теперь рассмотрим пример использования оператора объединения OUTER APPLY:
SELECT * FROM table1 AS t1 OUTER APPLY func1(t1.c2 + 1)
Результат выполнения этой команды будет следующим:
с1
с2
с3
с1
с2
с3
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
NULL
Пример 5.
Операторы PIVOT и UNPIVOT.
Рассмотрим использование оператора PIVOT на следующем примере: пусть, необходимо написать такую команду SELECT, которая для таблицы table1 вернет одну строку значений, которая для диапазона значений столбца c1 от 1 до 13 будет содержать среднее (округленное) значение по столбцу c2 для каждого присутствующего в таблице значения столбца c1. NULL – в случае, когда такого значения столбца c1 в таблице table1 нет.