SQLSERVER中,存储过程A调用存储过程B,如果存储过程B发生异常的话,在A里面能否获得异常信息?
不是要@@ERROR,而是要具体异常信息,即:ERROR_MESSAGE();经测试,不管B里面发生什么异常,A中顶多能能获取到@@ERROR,而获取不到ERROR_ME...
不是要@@ERROR,而是要具体异常信息,即:ERROR_MESSAGE();经测试,不管B里面发生什么异常,A中顶多能能获取到@@ERROR,而获取不到ERROR_MESSAGE();不知道哪位高人指点谜经?
或者如何通过@@ERROR如何能得到MESSAGE信息也可以 展开
或者如何通过@@ERROR如何能得到MESSAGE信息也可以 展开
2个回答
展开全部
楼上意思是在你的:
BEGIN TRY
EXEC @RESULT =ADMAPP.ADMAPP.sp_TEST2 --sp_TEST2 内部会发生异常
PRINT @@ERROR--此处打出来的是:0
END TRY
非PRINT出错误信息,而是 RAISERROR函数抛出异常,自然可以在CACTH块中捕获异常信息;
给个例子:
...
BEGIN
SET @IDS=STUFF(@IDS,1,1,'') --删除第一个','
RAISERROR('these id could''t insert:%s',16,1,@IDS) --抛出错误,自定义
END
END TRY
BEGIN CATCH
IF XACT_STATE()<>0 --当前有活动用户事务
ROLLBACK TRAN
DECLARE
@ErrorStr NVARCHAR(1000),@ErrorSeverity int,@ErrorState int,
@ErrorNumber int,@ErrorProcedure sysname,@ErrorLine int,@ErrorMessage nvarchar(4000)
SELECT
@ErrorStr=N'Error %d,Level %d,State %d,Procedure %s,Line %d,Message:%s',
@ErrorSeverity=ERROR_SEVERITY(),--错误严重性
@ErrorState=ERROR_STATE(),--错误状态号
@ErrorNumber=ERROR_NUMBER(),--错误号
@ErrorProcedure=ERROR_PROCEDURE(),--错误出现的存过或者触发器名称
@ErrorLine=ERROR_LINE(),--错误出现行
@ErrorMessage=ERROR_MESSAGE()
RAISERROR(--抛出错误,亦可以用PRINT
@ErrorStr, --抛出错误执行输出的错误信息内容
@ErrorSeverity,--错误的级别,严重性
@ErrorState, --状态,用@ErrorState也可以吧
@ErrorNumber,--错误号
@ErrorSeverity,--级别,严重性
@ErrorState,--状态
@ErrorProcedure,--错误出现的存过\触发器名称
@ErrorLine,--行数
@ErrorMessage--错误信息
)
END CATCH
BEGIN TRY
EXEC @RESULT =ADMAPP.ADMAPP.sp_TEST2 --sp_TEST2 内部会发生异常
PRINT @@ERROR--此处打出来的是:0
END TRY
非PRINT出错误信息,而是 RAISERROR函数抛出异常,自然可以在CACTH块中捕获异常信息;
给个例子:
...
BEGIN
SET @IDS=STUFF(@IDS,1,1,'') --删除第一个','
RAISERROR('these id could''t insert:%s',16,1,@IDS) --抛出错误,自定义
END
END TRY
BEGIN CATCH
IF XACT_STATE()<>0 --当前有活动用户事务
ROLLBACK TRAN
DECLARE
@ErrorStr NVARCHAR(1000),@ErrorSeverity int,@ErrorState int,
@ErrorNumber int,@ErrorProcedure sysname,@ErrorLine int,@ErrorMessage nvarchar(4000)
SELECT
@ErrorStr=N'Error %d,Level %d,State %d,Procedure %s,Line %d,Message:%s',
@ErrorSeverity=ERROR_SEVERITY(),--错误严重性
@ErrorState=ERROR_STATE(),--错误状态号
@ErrorNumber=ERROR_NUMBER(),--错误号
@ErrorProcedure=ERROR_PROCEDURE(),--错误出现的存过或者触发器名称
@ErrorLine=ERROR_LINE(),--错误出现行
@ErrorMessage=ERROR_MESSAGE()
RAISERROR(--抛出错误,亦可以用PRINT
@ErrorStr, --抛出错误执行输出的错误信息内容
@ErrorSeverity,--错误的级别,严重性
@ErrorState, --状态,用@ErrorState也可以吧
@ErrorNumber,--错误号
@ErrorSeverity,--级别,严重性
@ErrorState,--状态
@ErrorProcedure,--错误出现的存过\触发器名称
@ErrorLine,--行数
@ErrorMessage--错误信息
)
END CATCH
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你必须在嵌套最里面的存储过程中RAISERROR抛出错误,然后在外层才能得到,试试这样
BEGIN TRY
END TRY
BEGIN CATCH
DECLARE @ErrMsg NVARCHAR(4000),
@ErrSeverity INT
SELECT @ErrMsg = Error_message(),
@ErrSeverity = Error_severity()
RAISERROR (@ErrMsg,@ErrSeverity,1)
END CATCH
BEGIN TRY
END TRY
BEGIN CATCH
DECLARE @ErrMsg NVARCHAR(4000),
@ErrSeverity INT
SELECT @ErrMsg = Error_message(),
@ErrSeverity = Error_severity()
RAISERROR (@ErrMsg,@ErrSeverity,1)
END CATCH
追问
关键是,根本就进不到CATCH里面,貌似子存储过程无论发生什么异常,父级存储过程中都不认为它是个异常,如下:
@RESULT INT
BEGIN TRY
EXEC @RESULT =ADMAPP.ADMAPP.sp_TEST2 --sp_TEST2 内部会发生异常
PRINT @@ERROR--此处打出来的是:0
END TRY
BEGIN CATCH
PRINT '11111'
END CATCH
结果根本就打不出来'11111'
追答
我的意思是你在sp_TEST2 中抛出异常,然后在上面才能catch到
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询