суббота, 7 декабря 2013 г.

MS SQL stored procedure with cursor and temprary table


MS SQL использование временных таблиц для наполнения и возвращения данных при выполнении хранимых процедур в цикле, с использованием курсора



ALTER PROCEDURE spTemprary
AS  SET NOCOUNT ON
-- определяем переменные
DECLARE @cur   NVARCHAR(50)
DECLARE @var   NVARCHAR(550)
DECLARE @inc   int
DECLARE @coun  int
-- удаляем временную таблицу если она существует
IF OBJECT_ID('tempdb..##Temp') IS NOT NULL BEGIN DROP TABLE ##Temp END
-- создаем временную таблицу если она не существует
IF OBJECT_ID('tempdb..##Temp') IS NULL
begin
CREATE  TABLE  ##Temp (
N char(5), -- номер строки итоговой таблицы
Cat varchar(255), -- описание выводимой строки данных
Counter int -- общее количество
);
end
-- добавляем строки
set @var = 'INSERT  INTO ##Temp (N, Cat)   SELECT  ''1.'' , ''All cats''  ;'
EXEC (@var);
-- обновляем строки
    set @var = 'UPDATE  ##Temp  SET Counter=(SELECT  COUNT(DISTINCT dbo.Table1.Code) AS Expr
    FROM  dbo.TAble1
)'
EXEC (@var);
-- устанавливаем счетчик
SET @inc  = 1
-- цикл с применением курсора
DECLARE db_cursor CURSOR FOR
  SELECT Name FROM Table2
-- открываем курсор
OPEN db_cursor  
FETCH NEXT FROM db_cursor INTO @cur
WHILE @@FETCH_STATUS = 0  
BEGIN  
      SET @inc  = @inc+1
   SET @coun = ( SELECT   COUNT(DISTINCT dbo.Table1.Code) AS Expr
   FROM     dbo.Table1
   WHERE    (dbo.Table1.Name = @cur) )
   INSERT INTO  ##Temp (N, Cat, Counter) VALUES (rtrim(CAST(@inc AS char(3)))+'.', @cur, @coun)
     FETCH NEXT FROM db_cursor INTO @cur
END
-- закрываем курсор
CLOSE db_cursor  
-- освобождаем память
DEALLOCATE db_cursor
-- возвращаем результат
SELECT   *  FROM  dbo.[##Temp] RETURN
RETURN 

Комментариев нет:

Отправить комментарий

Постоянные читатели

Популярные сообщения