【发布时间】:2011-09-17 09:48:26
【问题描述】:
在上一个问题Problem with alter then update in try catch with tran using Transact-SQL 中,我发现要让我的 SQL 正常工作,我必须将它分成两批。这是用于此的 SQL:
USE PUK;
GO
BEGIN TRANSACTION;
BEGIN TRY
-- - Modify RETRIEVAL_STAT
alter table dbo.RETRIEVAL_STAT add
SOURCE nvarchar(10) NULL,
ACCOUNTNUMBER nvarchar(50) NULL,
PUK nvarchar(20) NULL;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
USE PUK;
GO
BEGIN TRANSACTION;
BEGIN TRY
-- transform logic.
UPDATE dbo.RETRIEVAL_STAT
SET SOURCE = 'ABC',
ACCOUNTNUMBER = ABC.ACCOUNTNUMBER,
PUK = ABC.PUK
FROM RETRIEVAL_STAT RS
INNER JOIN ABC
ON RS.SERVICE_NUMBER = ABC.SERVICENUMBER;
--- ... snip
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS ErrorNumber
,ERROR_SEVERITY() AS ErrorSeverity
,ERROR_STATE() AS ErrorState
,ERROR_PROCEDURE() AS ErrorProcedure
,ERROR_LINE() AS ErrorLine
,ERROR_MESSAGE() AS ErrorMessage;
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
IF @@TRANCOUNT > 0
COMMIT TRANSACTION;
GO
我现在的问题是:如果第一批失败,我如何防止第二批运行?
感谢您的建议!
罗伯 :)
【问题讨论】:
-
@Martin Smith Ok sweet raiserror('Oh no a fatal error', 20, -1) with log 很好地完成了这项工作。谢谢。
-
@Martin Smith 再三考虑,我仍然缺少一些信息:如何检测错误情况?在上面的示例中,我尝试更改更改表的名称并将 RAISERROR 放在 catch 中。它没有工作。它告诉我找不到对象“dbo.RETRIEVAL_SdTAT”,因为它不存在或者您没有权限。并愉快地继续运行其余的 SQL。
-
你试过这个答案吗? stackoverflow.com/questions/659188/…。它看起来像你想要的,但需要你在 SSMS 中使用 sqlcmd 或 sqlcmd 模式。
-
:on error exit 嗯,这似乎有效。谢谢。 :)
标签: tsql