是否有可能引发错误手动存储过程停止执行,并跳转到BEGIN CATCH
块? 一些模拟throw new Exception()
在C#
这里是我的存储过程的身体:
BEGIN TRY
BEGIN TRAN
-- do something
IF @foobar IS NULL
-- here i want to raise an error to rollback transaction
-- do something next
COMMIT TRAN
END TRY
BEGIN CATCH
IF @@trancount > 0
ROLLBACK TRAN
END CATCH
我知道一个办法: SELECT 1/0
但是这太可怕了!
您可以使用raiserror
。 更多的细节在这里
--from MSDN
BEGIN TRY
-- RAISERROR with severity 11-19 will cause execution to
-- jump to the CATCH block.
RAISERROR ('Error raised in TRY block.', -- Message text.
16, -- Severity.
1 -- State.
);
END TRY
BEGIN CATCH
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
-- Use RAISERROR inside the CATCH block to return error
-- information about the original error that caused
-- execution to jump to the CATCH block.
RAISERROR (@ErrorMessage, -- Message text.
@ErrorSeverity, -- Severity.
@ErrorState -- State.
);
END CATCH;
编辑如果您正在使用SQL Server 2012+可以使用throw
条款。 以下是详细内容。
你可以使用THROW
(在SQL Server中可用2012+):
THROW 50000, 'Your custom error message', 1
THROW <error_number>, <message>, <state>
MSDN THROW(的Transact-SQL)
RAISERROR扔之间的差异在SQL服务器
你要找的RAISERROR
。
从MSDN:
生成错误消息,并启动错误处理该会话。 RAISERROR可以参考存储在sys.messages目录视图中的用户定义的消息或动态地建立的消息。 该消息被返回作为服务器错误消息给调用应用程序或到TRY ... CATCH构造的相关联的CATCH块。
CodeProject上有一个很好的文章也介绍了深入的它是如何工作以及如何使用它的细节。
SQL有错误筹集机制
RAISERROR ( { msg_id | msg_str | @local_variable }
{ ,severity ,state }
[ ,argument [ ,...n ] ] )
[ WITH option [ ,...n ] ]
只是仰望RAISERROR联机丛书。 不过..你要产生相应的严重性的错误,在严重程度0到第十一个错误不会导致你跳转到catch块。
THROW(的Transact-SQL)
引发异常,执行转移到一个try ... catch构造的CATCH块在SQL Server 2017年。
请参考以下链接
T-SQL抛出异常