【发布时间】:2021-06-03 18:31:34
【问题描述】:
当我的程序试图在 while 循环中调用另一个程序时,我收到了错误。此外,当错误出现在 while 循环内时,它应该在记录后跳过下一次迭代,但下面的内容会退出循环。有人可以帮我解决这个问题吗?
CREATE PROCEDURE NUMBERS
AS
BEGIN TRY
BEGIN TRANSACTION
DECLARE VARIABLES
UPDATE log_1 table
DECLARE CURSOR FOR SELECT ANYTHING
OPEN CURUPD
FETCH NEXT FROM CURUPD INTO VARIABLES
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN TRY
UPDATE TABLE BASED ON VARIABLES
EXEC procedure_2 VARIABLES
INSERT TABLE BASED ON VARIABLES
END TRY
BEGIN CATCH
Update Log_2 Table
SCount = SCount-1;
FCount = Fcount+1;
END CATCH
SCount = SCount+1;
FETCH NEXT FROM CURUPD INTO VARIABLES
END
CLOSE CUR
DEALLOCATE CUR
UPDATE LOG_1;
COMMIT TRANSACTION
END TRY
BEGIN CATCH
ROLLBACK TRANSACTION
UPDATE LOG_1 Table
END CATCH
【问题讨论】:
-
我不会假装理解这些——当我把它放在 SSMS 中时,它会给出一大堆语法错误。但是我可以评论说,在提交/回滚事务以确保存在之前,检查
@@TRANCOUNT通常是值得/必要的。 -
因此,如果我在我的 while 循环中调用一个过程,它将是该特定过程的单独事务。我将如何保存在 while 循环中调用我的存储过程之前发生的事务。另外,我想在该特定迭代的整个过程完成后提交我的代码。我不想在两者之间提交代码,所以如果出现错误,我可以简单地回滚更改。
-
所以如果我在代码的每个部分提交我的事务让我们说在调用过程之前,在第二个过程中,如果我在过程之后执行插入语句时出错,那么我会无法回滚更改。我该如何处理这部分?
-
您真的需要涵盖所有交易和每个 SP 调用的单个交易吗?或者你可以把它们放在 SP 里面吗?你有没有考虑过使用savepoints
标签: sql-server tsql while-loop cursor procedure