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


 



© 2018 | Анна Петросян | pashelp@yandex.ru