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