如何使用存储过程递归更新表

时间:2013-05-21 21:18:25

标签: sql sql-server

我有一个存储过程,它以与原始表不同的格式选择一些数据:

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个表。但是,我希望所有这些表都加入到一个表中。我该怎么做呢?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

上面的命令将返回返回的所有结果集的并集,但是如果你可以修改程序(或者创建一个新程序)可以返回没有循环的完整集,那么我建议你这样做。