T-SQL | Открыть CURSOR (Recordset), обработать в цикле |
Например, есть таблица ClientDiscountTable по скидкам клиентов:
Нужно разработать функцию, которая бы возвращала все виды доступных скидок одной строкой на заданного клиента и дату.
Например, для ClientID 20060717/1 на 4-е января 2007-го года функция возвратит строку: 'Дисконтная карта, Новогоднее предложение, День рождения'.
План разработки функции:
➢Выполнить Select запрос 'описание скидки' к таблице ClientDiscountTable, полю DiscountDescr, по параметрам: 'клиент' и 'дата покупки'. ➢Открыть рекордсет результата запроса. ➢В цикле перебрать записи по полю DiscountDescr и полученные значения положить в строку, вернуть результат.
В MS SQL Server 2005 и выше для пободных задач можно использовать также оператор STUFF
/* @ID – клиент @Date – дата @DiscountDescr – перебираемые значения поля DiscountDescr @result – результат ids_cursor – объявляем CURSOR (Recordset) */
CREATE FUNCTION [dbo].[ClientDiscountContentString] (@ID nvarchar(12), @Date datetime) RETURNS varchar(400) AS BEGIN
DECLARE @DiscountDescr as varchar(400) DECLARE @result as varchar(400) DECLARE ids_cursor CURSOR FOR
SELECT DiscountDescr FROM ClientDiscountTable WHERE ClientID = @ID AND CONVERT(DATETIME, @Date, 102) >= DiscountStartDate AND CONVERT(DATETIME, @Date, 102) <= DiscountEndDate OPEN ids_cursor SET @result = ''
-- выполнить первое считывание и сохранить указанные значения (выполненного Select запроса) -- FETCH - достать FETCH NEXT FROM ids_cursor
-- переменные должны идти в том же порядке, в котором идут клонки Select запроса INTO @DiscountDescr
-- проверить, считалась ли запись: если результат считывания успешный, обработать полученные данные WHILE @@FETCH_STATUS = 0 BEGIN set @result = @result + @DiscountDescr + ', '
-- продолжить пока есть записи в рекордсете FETCH NEXT FROM ids_cursor INTO @DiscountDescr END
-- закрыть рекордсет, освободить ресурсы на сервере CLOSE ids_cursor DEALLOCATE ids_cursor
-- если цикл не отработал (SELECT не возвратил значений), тогда возвратить NULL, иначе строку @result без последнего символа IF @result = '' RETURN NULL RETURN substring(@result, 1, Len(@result)-1) END
|