我正在查看是否能够在此存储过程中正确捕获我的错误:
ALTER PROCEDURE [dbo].[sp_UpdateText]
(@aID AS INT,
@CompanyID AS INT,
@CompanyName AS VARCHAR(MAX))
AS
BEGIN
DECLARE @Result VARCHAR(MAX)
BEGIN TRY
SET @Result = (SELECT dbo.[udf_StripHTMLTags](@CompanyName)) -- UDF function that strips HTML tags off my text field
BEGIN TRANSACTION
UPDATE __TestTable1
SET CompanyName = @Result
WHERE aid = @aid AND CompanyID = @CompanyID
COMMIT TRANSACTION
END TRY
BEGIN CATCH
DECLARE @ErrorNumber INT = ERROR_NUMBER();
DECLARE @ErrorLine INT = ERROR_LINE();
PRINT 'ERROR NUMBER: ' + CAST(@ErrorNumber as Varchar(10));
PRINT 'ERROR LINE: ' + CAST (@ErrorLine as Varchar(10));
END CATCH
END
Go
我基本上希望这些BEGIN TRY BEGIN CATCH错误捕获方法能够成功捕获错误(如果出现)?有什么想法吗?
答案 0 :(得分:4)
您应该签出Erland's Guide to Error Handling
此包含性指南的建议是将您的CATCH
至少更改为
BEGIN CATCH
IF @@trancount > 0 ROLLBACK TRANSACTION --roll back the tran
DECLARE @msg nvarchar(2048) = error_message() --error message is usually more helpful
DECLARE @ErrorNumber INT = ERROR_NUMBER();
DECLARE @ErrorLine INT = ERROR_LINE();
RAISERROR(@msg,16,1) --RAISE the error
RETURN 55555 --return a non-zero to application as non-success
END CATCH
里面有很多东西,这就是为什么值得一读。
我差点忘了,SET XACT_ABORT, NOCOUNT ON
位于您过程的顶部。
激活XACT_ABORT ON时,几乎所有错误都相同 效果:任何打开的事务都会回滚,执行将中止。 有一些例外,其中最突出的是 RAISERROR语句。
请注意,“打印”错误不会在任何地方存储或记录错误,例如SQL Server错误日志,因此您根本不会“捕获”该错误。