您自己的所有来自 MSSQL 的错误都会有 ERROR_NUMBER 50000。您可以使用sp_addmessage注册自己的消息,但使用它们很笨拙。
MSSQL 2012 有新的关键字THROW,这正是你想要的。
因此,假设您从 CATCH 块中的故障中恢复,您可以在 2008 年做什么:
- 您可以构建自己的错误消息,该消息将在 Exception.Message
- ERROR_NUMBER 一文不值
- ERROR_SEVERITY 严重性用于不同目的
- 嘿,有ERROR_STATE,你可以使用它:)
- 对于存储过程,您可以使用 RETURN 值或 OUTPUT 参数来传递有关成功或失败的信息
BEGIN TRY
BEGIN TRAN
--
-- some code
--
IF @@ROWCOUNT = 0 OR @SomeYourValue <> @SomeOtherValue
RAISERROR('Your own error message', 16, 1);
--
-- some code
--
IF @@ROWCOUNT > 10 OR @SomeYourValue = @SomeOtherValue
RAISERROR('Your own error message', 16, 2);
COMMIT
END TRY
BEGIN CATCH
DECLARE
@ErrorMessage NVARCHAR(2048) = ERROR_MESSAGE(),
@ErrorNumber INT = ERROR_NUMBER(),
@ErrorSeverity INT = ERROR_SEVERITY(),
@ErrorState INT = ERROR_STATE(),
@ErrorProcedure NVARCHAR(126) = ERROR_PROCEDURE(),
@ErrorLine INT = ERROR_LINE()
ROLLBACK
-- construct your own awesome message
SET @ErrorMessage =
LEFT(
'Error ' + CAST(@ErrorNumber AS VARCHAR(10)) + ': '
+ @ErrorMessage
+ ' Line: ' + CAST(@ErrorLine AS VARCHAR(10))
+ ISNULL(' ' + @ErrorProcedure, ''), 2044)
-- pass error
RAISERROR(@ErrorMessage, @ErrorSeverity, @ErrorState)
-- or use return value if you want numbers instead Error messages from SQL
IF @ErrorNumber < 50000
RETURN @ErrorNumber
ELSE
RETURN -@ErrorState
-- In Delphi: AdoProc.Parameters.ParamByName('@RETURN_VALUE').AsInteger:
-- 0 = all OK
-- > 0 - some SQL error number
-- < 0 - hey, my own errors!
-- or declare @ErrorMessage, @ErrorNumber and @ErrorState as
-- procedure's OUTPUT parameters
END CATCH