--使用系统视图sys.messages查看系统中定义的错误
language_id =2052 china language_id =1033 english SELECT * FROM sys.messages WHERE message_id =66666
--1.创建自定义错误消息 添加到系统消息
EXEC sp_addmessage @msgnum = 66666, --错误号
@severity = 16, --严重级别
@msgtext ='procedure error;this is custom exception',
-- @lang = 'us_english', --语言版本
@with_log= 'TRUE', --记入日志,也可以在实际产生错误时指定是否记入日志
@replace = 'replace' --替换已经存在的错误号
go
--language_id =2052 china language_id =1033 english
-- SELECT TOP 100 * FROM sys.messages WHERE message_id =66666
EXEC sp_addmessage @msgnum = 66666,
@severity = 16,
@msgtext ='procedure error;this is custom exception',
@lang = 'us_english',
@with_log= 'FALSE',
@replace = 'replace'
参考 如何在sqlserver 的函数或存储过程中抛出异常。 - 三小 - 博客园
使用方法
/*==============================================================================
// 存储过程: procedure_name
//------------------------------------------------------------------------------
// 描述:
//
//------------------------------------------------------------------------------
// 参数:
//------------------------------------------------------------------------------
// 返回值: @code nvarchar(100) -返回是否成功 -1错误 , 0失败 ,1成功
//------------------------------------------------------------------------------
// 作者 日期:
//------------------------------------------------------------------------------
// 修改历史:
// commit tran一航放到最后
//------------------------------------------------------------------------------
//==============================================================================*/
CREATE PROCEDURE dbo.C_SP_TESTTRAN
@result int output, --成功 1; 失败 0
@message nvarchar(100) output
AS
BEGIN
SET NOCOUNT ON
begin try
--设置事物回滚机制,xact_abort为 on,回滚整个事务
set xact_abort on
begin tran yy
DECLARE @res INT
DECLARE @msg nvarchar(500),@outstr nvarchar(500)
SET @res = 0
SET @msg = ''
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
DROP TABLE #temp
IF @msg = ''
BEGIN
--执行语句
SET @res =@@ROWCOUNT
SET @msg = 'OK'
end
IF @res < 0
BEGIN
SET @msg = '自定义异常'
RAISERROR (66666, 16, 1);
END
--- 最后输出结果
SELECT @msg AS msg , @res AS code
end try
begin catch
IF @@ERROR = 66666
SET @outstr = @msg
ELSE
SET @outstr = ERROR_MESSAGE()
if @@trancount>0
rollback tran yy;
--- 最后输出结果
SELECT @outstr AS res_msg
END CATCH
if @@trancount>0
commit tran yy;
SET NOCOUNT OFF;
END