我遇到了这样一种情况:我需要重复执行一个存储过程,现在这个过程(spMAIN)中有一个游标,它可以从T1形式的表中查找一个值,它的结构如下
ID Status
---- --------
1 New
2 New
3 success
4 Error现在游标查找状态为'New‘的所有行
现在,在处理过程中,如果该游标实例遇到错误,另一个SP表示需要调用spError,T1中的'Status‘列需要更新为'Error’,并且需要再次调用spMAIN,这将再次重复该过程,查找带有'new‘的行
我该怎么做呢?此外,在此过程中,如果一个SP中有其他SP,并且其中任何一个SP引发错误,则需要执行相同的操作,需要更新T1表(“error”),并且需要再次调用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发布于 2010-06-09 09:44:51
从SQL Server2005开始,您可以使用SQL Server内置的TRY CATCH功能执行错误处理。我建议您重新评估查询逻辑,并查看SQL CLR或MERGE语句之类的内容。通过示例代码判断,这应该是一种特别容易采用的方法。
发布于 2010-06-09 09:46:42
所有这些框架看起来都很好,所以我不确定您的问题是什么(如果您有很多嵌套的so,请尝试/捕获并重新抛出错误)。
然而,,基于集合的方法是首选的。如果你能给出更多的要求,我们可能会提出一些更容易的建议。通常,对于轮询类型的场景,我通常使用在整个新行集合上操作的代理作业(可能使用游标),或者您可以为它们分配一个批号并开始处理该批次。当代理作业下一次触发时,只有没有批处理的新行将被分配另一个批处理,该批处理将停止并得到处理。
但在不了解你潜在动机的情况下...
https://stackoverflow.com/questions/3002459
复制相似问题