2013-05-21 1 views
0

У меня есть хранимая процедура, которая выбирает некоторые данные в другом формате из моей исходной таблицы:Как рекурсивно обновить таблицу с хранимой процедурой

USE [VolTracker] 
GO 

DECLARE @return_value int, 
     @offset int 

SET @offset = 5 

WHILE @offset >= 1 BEGIN 
    EXEC @return_value = [dbo].[sp_getStats] 
      @Doffset = @offset, 
      @StartTime = --Some Datetime, 
      @EndTime = --Some later Datetime, 
      @Contract = NULL 

    SET @offset = @offset - 1 
END 

GO 

Этот конкретный пример выбирает все 5 из таблиц, которые я бы как это правильно. Тем не менее, я бы хотел, чтобы все эти таблицы были объединены в одну таблицу. Как я могу это сделать?

+1

«Хранимая процедура, которая выбирает некоторые данные в другом формате из моей исходной таблицы», звучит как описание вида для меня. И МОСТ того времени, когда цикл, чтобы что-то сделать в SQL, может быть выполнен по-разному/лучше с использованием наборов - есть редкие исключения. –

ответ

2

Создать переменную таблицы, которая соответствует схеме набора результатов, возвращаемого sp_getStats. Затем вставьте в эту переменную внутри вашего цикла:

... 
declare @Stage table (YourColumn1 varchar(10), YourColumn2 int, ...); 

WHILE @offset >= 1 BEGIN 
    INSERT INTO @Stage 
     EXEC @return_value = [dbo].[sp_getStats] 
       @Doffset = @offset, 
       @StartTime = --Some Datetime, 
       @EndTime = --Some later Datetime, 
       @Contract = NULL 

    SET @offset = @offset - 1 
END 

select * from @Stage; 

выше будет работать, чтобы вернуть объединение всех ResultSets вернулся, однако, если его возможно для Вас, чтобы изменить процедуру (или создать новый), который может верните полный набор без цикла, тогда я бы предложил делать.

2

Создайте временную переменную таблицы или таблицы и вставьте в таблицу каждый раз при выполнении хранимой процедуры. Проверьте this.

//declare your #temptable here 

WHILE @offset >= 1 BEGIN 
    INSERT INTO #tempTable 
    EXEC @return_value = [dbo].[sp_getStats] 
      @Doffset = @offset, 
      @StartTime = --Some Datetime, 
      @EndTime = --Some later Datetime, 
      @Contract = NULL 

    SET @offset = @offset - 1 
END 
Смежные вопросы