【发布时间】:2021-05-30 18:32:24
【问题描述】:
我有一个简单的存储过程,如下所示。如您所见,错误是在动态 SQL 内部强制生成的,并传递给 CATCH 块。问题是我期望的细节没有返回。我得到的只是这条消息:
消息 50000,级别 16,状态 1,过程 myproc,第 35 行 [批处理开始行 2]
为什么我不能取回 CATCH 块中编码的信息 - 过程名称、错误行和错误消息?
这是我的程序:
CREATE PROCEDURE myproc
AS
SET XACT_ABORT ON
BEGIN TRY
DECLARE @nSQL NVARCHAR(MAX) = 'SELECT 1/0'
EXEC sp_executesql @nSQL
END TRY
BEGIN CATCH
DECLARE @ERROR_NUMBER INT;
DECLARE @ERROR_SEVERITY INT;
DECLARE @ERROR_STATE INT;
DECLARE @ERROR_PROCEDURE NVARCHAR(128);
DECLARE @ERROR_LINE INT;
DECLARE @ERROR_MESSAGE NVARCHAR(4000);
SET @ERROR_NUMBER = ERROR_NUMBER();
SET @ERROR_SEVERITY = ERROR_SEVERITY();
SELECT @ERROR_STATE = CASE
WHEN ERROR_STATE() = 0 THEN 1
ELSE ERROR_STATE()
END;
SET @ERROR_PROCEDURE = ERROR_PROCEDURE();
SET @ERROR_LINE = ERROR_LINE();
SET @ERROR_MESSAGE = 'ERROR in ' + @ERROR_PROCEDURE + '; (ERROR Line: ' + CAST(@ERROR_LINE AS NVARCHAR(5)) + '); ' + 'ERROR MESSAGE: '
+ ERROR_MESSAGE() + ';';
RAISERROR(@ERROR_MESSAGE, @ERROR_SEVERITY, @ERROR_STATE);
RETURN (1);
END CATCH;
【问题讨论】:
-
接球有什么意义,只是为了再次加注?如果你想再加注,为什么不直接
THROW;
标签: sql-server error-handling try-catch