首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复执行存储过程

重复执行存储过程
EN

Stack Overflow用户
提问于 2010-06-09 09:02:54
回答 2查看 708关注 0票数 1

我遇到了这样一种情况:我需要重复执行一个存储过程,现在这个过程(spMAIN)中有一个游标,它可以从T1形式的表中查找一个值,它的结构如下

代码语言:javascript
复制
ID     Status
----   --------
1      New
2     New
3     success
4     Error

现在游标查找状态为'New‘的所有行

现在,在处理过程中,如果该游标实例遇到错误,另一个SP表示需要调用spError,T1中的'Status‘列需要更新为'Error’,并且需要再次调用spMAIN,这将再次重复该过程,查找带有'new‘的行

我该怎么做呢?此外,在此过程中,如果一个SP中有其他SP,并且其中任何一个SP引发错误,则需要执行相同的操作,需要更新T1表(“error”),并且需要再次调用spMAIN。

你也可以推荐一些东西吗?

下面是一些代码

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2010-06-09 09:44:51

从SQL Server2005开始,您可以使用SQL Server内置的TRY CATCH功能执行错误处理。我建议您重新评估查询逻辑,并查看SQL CLR或MERGE语句之类的内容。通过示例代码判断,这应该是一种特别容易采用的方法。

票数 2
EN

Stack Overflow用户

发布于 2010-06-09 09:46:42

所有这些框架看起来都很好,所以我不确定您的问题是什么(如果您有很多嵌套的so,请尝试/捕获并重新抛出错误)。

然而,,基于集合的方法是首选的。如果你能给出更多的要求,我们可能会提出一些更容易的建议。通常,对于轮询类型的场景,我通常使用在整个新行集合上操作的代理作业(可能使用游标),或者您可以为它们分配一个批号并开始处理该批次。当代理作业下一次触发时,只有没有批处理的新行将被分配另一个批处理,该批处理将停止并得到处理。

但在不了解你潜在动机的情况下...

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3002459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档