Начиная с версии 2008 MS SQL Server позволяет принимать табличные наборы данных в качестве параметров хранимых процедур и функций.
Рассмотрим подробнее использование этого приёма.
Чтобы MS SQL Server смог принять в качестве параметра таблицу требуется описать её структуру. Для этого создадим пользовательский тип данных, который будет содержать данное описание.
В качестве примера создадим тип данных, который описывает список моделей автомобилей.
1 2 3 4 5 |
CREATE TYPE CarList AS TABLE ( id int NOT NULL, ModelTitle nvarchar(50) NOT NULL ) |
После того как соответствующий тип данных создан, его можно использовать для обозначения табличных параметров в хранимых процедурах и функциях.
Напишем функцию, которая будет возвращать количество записей в табличном наборе созданного ранее типа.
1 2 3 4 5 6 7 8 9 10 11 12 |
CREATE FUNCTION CarListCount ( @cars dbo.CarList READONLY ) RETURNS INT AS BEGIN DECLARE @countCars AS INT; SELECT @countCars= COUNT (*) FROM @cars; RETURN @countCars; END GO |
Обратите внимание, что табличный параметр обозначен как readonly. Это обозначение является обязательным, так как над такими параметрами в MS SQL Server запрещено выполнять операции связанные с изменением данных (INSERT, UPDATE, DELETE) в процедурах и функциях.
Если мы создадим табличную переменную типа CarList и вызовем функцию CarListCount, мы получим количество записей в этой переменной.
Например:
1 2 3 4 5 6 |
DECLARE @cars AS dbo.CarList; INSERT INTO @cars (id,ModelTitle) VALUES (1,'UAZ'); INSERT INTO @cars (id,ModelTitle) VALUES (2,'Lada'); INSERT INTO @cars (id,ModelTitle) VALUES (3,'KAMAZ'); SELECT * FROM @cars; SELECT dbo.CarListCount(@cars); |
Работа с параметрами возвращающими табличное значение в хранимых процедурах осуществляется аналогичным образом.
Параметры возвращающие табличное значение очень удобны при работе с большими объёмами структурированных данных, так как позволяют обращаться с ними как с таблицей. По этой же причине они дают возможность в ряде случаев оптимизировать выполнение сложных запросов.
Так, что применяя подобные параметры можно добиться весьма существенного положительного эффекта как в плане упрощения реализации алгоритмов, так и с точки зрения быстродействия.
Добавить комментарий