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
Комментариев нет:
Отправить комментарий