2010-06-09 85 views
1

我有一种情况,我需要重复执行一个存储过程 现在,此过程(spMAIN)中有一个光标,其中从表中查找值为T1,具有以下结构重复执行存储过程

ID  Status 
---- -------- 
1  New 
2  New 
3  success 
4  Error 

现在光标查找所有行的状态为“新建”

现在同时处理,如果光标的该实例遇到错误时,另一SP说spError需要被调用,“状态” T1中的列需要更新为'错误',并且需要再次调用spMAIN,它再次重复该过程,查找行与'新'

我该怎么做?另外,当我们谈论它的时候,如果一个SP内部有其他SP,并且如果这些SP中的任何一个产生了错误,同样的事情需要完成,T1表需要被更新('错误')并且需要再次调用spMAIN。

你能推荐些什么吗?

这里的一些代码

ALTER PROC zzSpMain 
AS 
    BEGIN 
     DECLARE @id INT 
     BEGIN TRY 
     IF EXISTS (SELECT * 
        FROM  dbo.zzTest 
        WHERE istatus = 'new') 
      BEGIN 


       DECLARE c CURSOR 
        FOR SELECT id 
         FROM zztest 
         WHERE istatus = 'new' 

       OPEN c 
       FETCH NEXT FROM c INTO @id 

       WHILE @@FETCH_STATUS = 0 
        BEGIN 
        PRINT @id 


        IF @id = 2 
         BEGIN   
          UPDATE zztest 
          SET  istatus = 'error' 
          WHERE id = @id 
          RAISERROR ('Error occured', 16, 
           1) 
         END 

        UPDATE zztest 
        SET  istatus = 'processed' 
        WHERE id = @id 

        FETCH NEXT FROM c INTO @id 
        END 
       CLOSE c 
       DEALLOCATE c 

      END 

     END TRY 
     begin CATCH 

     EXEC zzSpError 
     END CATCH 

    END 
+4

任何时候,我看到一个光标,我通常一定有一个更好,更RDBMS集式的方式来做到需要什么。 – Joe 2010-06-09 01:11:09

回答

2

您可以执行与内置的以SQL Server和SQL Server 2005中开始我建议你尝试捕捉功能处理错误重新评估您的查询的逻辑,并期待像SQL CLR或MERGE语句。根据示例代码判断,这应该是一条特别容易的路线。

2

所有这个框架看起来都很好,所以我不确定你的问题是什么(如果你有很多嵌套的SP,TRY/CATCH和重新抛出错误)。

但是,,基于集合的方法是优选的。如果您可以提供更多的要求,我们可能会提出更简单的建议。通常,对于轮询类型的场景,我通常使用代理作业,它可以在整个新行(可能使用游标)上进行操作,也可以为其分配批次号并开始处理该批次。当下次代理作业触发时,只有没有批处理的新行将被分配另一批处理,然后进行处理。

但不知道更多关于你的潜在动机......