MSSQL的所有錯誤都會有ERROR_NUMBER 50000.您可以使用sp_addmessage註冊自己的消息,但使用它們很笨拙。
MSSQL 2012有新的關鍵字THROW,這正是你想要的。
你可以做2008年那麼,假設你從失敗中CATCH塊恢復:
- 您可以構建自己的錯誤消息,這將是Exception.Message
- ERROR_NUMBER不值錢
- ERROR_SEVERITY嚴重程度是出於不同的目的
- 嘿,有ERROR_STATE,您可以使用:)
- 對於存儲過程,你可以使用合格的返回值或輸出參數有關成功或失敗的信息
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 [email protected]
-- 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
感謝您的解決方案。但是我需要在Delphi中得到一個錯誤號。還有其他解決方案嗎? – 2013-05-05 03:55:52
它在示例代碼中。您可以使用RETURN值或OUTPUT參數 - 存儲過程。或者你可以「構建你自己的真棒」ErrorMessage並在裏面添加ErrorNumber。 – DiGi 2013-05-05 08:27:17