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