使用基于集合的方法迭代地执行存储过程

时间:2015-03-23 20:00:56

标签: sql tsql set-based

我有一个问题,我试图用不同的解决方案替换以下代码。目前我正在使用游标,但它运行缓慢。我理解迭代解决方案只能用游标或while循环来完成,但我试图找到一个基于集合的方法并且没有想法。我希望我能在这里找到一些灵感。谢谢大家。

--used to find a unique list of Some_ID
@Id1, @Id2, @Id3

DECLARE SomeCursor CURSOR FOR
            SELECT SOME_ID FROM SomeTable 
                  WHERE ID1=@Id1 AND ID2=@Id2 and ID3=@Id3

    OPEN SomeCursor
          FETCH NEXT FROM SomeCursor INTO @SomeID
    WHILE @@Fetch_Status = 0      
    BEGIN

        Print @SomeID

        --simply populates a single table with values pulled from 
        --other tables in the database based on the give parameters.
        EXEC SP_PART1 @SomeID, @parameters...
        print 'part 2  starting'
        EXEC SP_PART2 @SomeID, @parameters...

        FETCH NEXT FROM SomeCursor INTO @SomeID

        print getdate()

    END 
    CLOSE  SomeCursor;
    DEALLOCATE SomeCursor;

2 个答案:

答案 0 :(得分:0)

使这个基于集合的唯一选择是重写sps以使它们基于集合(使用表格式参数的各个参数)或在此proc中编写基于集合的代码而不是重新使用设计的过程用于单一记录。这种情况下代码重用通常是不合适的。

答案 1 :(得分:0)

我不太确定你想要什么,但是为什么不使用你的select语句来创建你的sql脚本并用这样的东西一次性执行它们。

DECLARE @sql VARCHAR(MAX);

SELECT @sql = COALESCE(@sql,'') + 'EXEC SP_Part1 ' + SOME_ID  + '; EXEC SP_Part2 ' + SomeID + '; GO '
FROM SomeTable 
WHERE ID1=@Id1 AND ID2=@Id2 and ID3=@Id3

EXEC (@sql)