Табличные функции в SQL
• Понятие табличных функций
В SQL:2003 специфицированы табличные функции, т.е. функции, вызываемые из SQL и возвращающих результат «таблицу». Поскольку в SQL нет типа таблица, то фактически результатом табличной функции является мультимножество (типом элементов которого является анонимный строчный тип). Однако к результату табличной функции можно адресовать запросы таким же образом, как и к таблица. В синтаксических конструкциях для определения и вызова табличных функций предусмотрено ключевое слово TABLE.
• Внешние табличные функции
CREATE FUNCTION Func1() RETURNS TABLE(CName Char(10), SName Char(10), ONum Integer)
NOT DETERMINISTIC
NO SQL //нет SQL-операторов
LANGUAGE C
EXTERNAL //результаты могут быть неопределенными значениями
PARAMETER STYLE SQL
Внешние табличные функции позволяют запрашивать данные, которые не хранятся в базовых таблицах и являются внешними по отношению к ним (в примере тело функции на С не приведено).
SELECT SName, ONum FROM TABLE(Func1()) AS TT WHERE TT.CName=’Hoffman’
• Табличные функции на SQL
CREATE FUNCTION Func2(CName Char(10)) RETURNS TABLE(SName Char(10), ONum Integer)
LANGUAGE SQL
READS SQL DATA //доступ к данным будет только в режиме чтения
DETERMINISTIC //один результат при одних данных
RETURN TABLE (SELECT SName, ONum FROM Orders WHERE Orders.CName=Func2.CName)
Подобные функции иногда называют параметрическими представлениями. Чаще всего табличные функции с ключевым словом TABLE вызываются в разделе FROM оператора выборки, но могут вызываться везде, где может присутствовать ссылка на таблицу.
• Табличные функции в SQL Server
— Хранимые табличные функции в SQL Server
CREATE FUNCTION <имя функции> ([@<имя параметра> [AS] <тип данных>[(<размер>)] [=<значение по умолчанию>][READONLY],…]) RETURNS TABLE [AS] RETURN [(]<запрос>[)]
Примечание: многооператорная табличная функция отличается от вышеуказанной однострочной указанием имени таблицы и списка столбцов.
… RETURNS <имя таблицы> TABLE (@<имя параметра> [AS] <тип данных>[(<размер>)],…) [AS] …
Пример:
USE B1
GO
CREATE FUNCTION CustCity(@City VarChar(20)=’San Jose’) RETURNS TABLE AS RETURN
(SELECT CNum, CName, Fating FROM Customer WHERE City=@City) GO
SELECT * FROM CustCity(‘London’);
CNum | CName | Rating |
2001 | Hoffman | 100 |
2008 | Clemens | 100 |
SELECT * FROM CustCity(Default);
CNum | CName | Rating |
2003 | Liu | 200 |
2008 | Clemens | 300 |
• Внешние табличные функции в SQL Server
CREATE FUNCTION <имя функции CLR> ([@<имя параметра> [AS] <тип данных>[(<размер>)] [=<значение по умолчанию>],…])
RETURNS TABLE <определение табличных данных в CLR> [ORDER (<определяется порядок сортировки>)] [AS] EXTERNAL NAME <имя метода CLR>