Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
LektsiiNovye.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.92 Mб
Скачать

Функции Inline

Создание функций этого типа выполняется с помощью команды CREATE FUNCTION, имеющей следующий синтаксис:

CREATE FUNCTION [<owner_name>.]<function_name> ( [ { (@parameter name <scalar_parameter_data_type> [ = <default> ]} [ , ...n ] ] ) RETURNS TABLE [ WITH < function_option > [ ,...n ] ] [ AS ] RETURN [ ( ] <select –stmt> [ ) ]

Основная часть параметров, используемая при создании функции типа Inline, была рассмотрена в предыдущем разделе при рассмотрении функций типа Scalаr. Тем не менее создание функций типа Inline имеет свою специфику. Как видно, после ключевого слова RETURNS всегда должно указываться ключевое слово TABLE. Таким образом, функция Inline должна строго возвращать значение типа данных table. Как видно, структура возвращаемого значение типа table не указывается явно при описании собственно типа данных. Вместо этого сервер будет автоматически использовать для возвращаемого значения table структуру, возвращаемую запросом SELECT, который является единственной командой функции. Код этого запроса задаётся с помощью аргумента <select-stmt>.

Особенностью функции Inline является то, что структура значения table создаётся динамически в ходе выполнения запроса, а не указывается явно при определении типа после ключевого слова RETURNS. Как уже было сказано, возвращаемое функцией значение table может быть использовано непосредственно в запросе. То есть в разделе FROM запроса можно указывать непосредственно имя функции со всеми входными параметрами.

В качестве примера рассмотрим создание функции Inline, которая возвращает список грузовых помещений определённого судна (идентификатор которого передаётся функции в качестве параметра):

CREATE FUNCTION fanc2 (@судно int) RETURNS TABLE AS RETURN (SELECT КраткоеНазвание, ОбъемПомещения, ПлощадьПомещения FROM dbo.СудаГрузовыеПомещения WHERE (СсылкаСудно = @судно)) GO

Теперь попробуем использовать эту функцию для получения списка грузовых помещений:

SELECT * FROM Func2(2) ORDER BY КраткоеНазвание

Функции Multistatement

Создание функций этого типа выполняется с помощью команды CREATE FUNCTION, имеющей следующий синтаксис:

CREATE FUNCTION [ <owner_name>. ] <function_name> ( [ { @parameter_name <scalar parameter_data_type> [ = <default> ] } [ ,...n ] ] ) RETURNS @return_variable TABLE <table_type_definition > [ WITH < function_option >. [ ,...n ] ] [ AS ] BEGIN <function_body> RETURN END

Использование большей части входных параметров команды было рассмотрено при описании функций типа Scalar и Inline.

Как уже было сказано ранее, функции Multistatement, как и функции Inline, возвращают значение типа table. Однако, в отличие от функций типа Inline, при создании функций Multistatement необходимо явно задать структуру возвращаемого значения. Эта структура указывается непосредственно после ключевого слова TABLE и, таким образом, является частью определения возвращаемого типа данных. Для описания структуры используется конструкция <table_type_definition>, которая имеет следующий синтаксис:

< table_type_definition > ::= ( { <column_definition> | <table_constraint> } [ ....n ] )

Синтаксис конструкций <column_definition> и <table_constraint> полностью соответствует одноименным структурам, используемым при создании обычных таблиц с помощью команды CREATE TABLE. Набор данных, которые будут возвращены, должен формироваться с помощью команд INSERT, выполняемых в теле функции. В теле функции допускаются различные конструкции Transact-SQL, которые могут контролировать значения, размещаемые в наборе строк. При работе с командой INSERT необходимо явно указать имя объекта, в который необходимо вставить строки. Поэтому в функциях Multistatement, в отличие от функций Inline, необходимо присвоить какое-то имя значению table. Это имя и указывается с помощью параметра @return_variable.

Завершение работы функции, помимо ошибок выполнения, происходит в случае, когда в коде функции встречается ключевое слово RETURNS. В отличие от функций типа Scalаr при использовании команды RETURN не нужно указывать значение, которое должно быть возвращено. Сервер автоматически возвратит набор данных типа table, имя и структура которого была указана после ключевого слова RETURNS. Необходимо отдельно отметить, что завершение работы функции происходит только тогда, когда встречается команда RETURN. Это утверждение верно и в том случае, когда речь идёт о достижении конца тела функции  самой последней командой должна быть команда RETURN.

В качестве примера рассмотрим создание функции, которая будет принимать в качестве входного параметра строку, содержащую множество слов, разделённых пробелами, и которая будет разбивать всю строку на отдельные слова и каждое из них помещать в отдельную строку:

CREATE FUNCTION Func3 (@String nvarchar(500)) RETURNS @tabl TABLE (Number int IDENTITY (1,1) NOT NULL, Value nvarchar(30)) AS BEGIN DECLARE @Strl nvarchar(500), @Pos int set @Pos=1 SET @Strl= @String while @Pos >=0 BEGIN SET @Pos = CHARINDEX(' ' , @Strl) IF ( @Pos>0) BEGIN INSERT INTO @tabl VALUES (SUBSTRING(@Strl , 1, @Pos)) SET @Strl = SUBSTRING (@Strl, @Pos+1, 500) END ELSE BEGIN INSERT INTO @tabl VALUES (@Strl) break END END RETURN END

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]