SQL Server动态SQL中单语句多错误捕获问题求助
解决方案:捕获单条SQL语句产生的所有错误信息
针对SQL Server中单条动态SQL语句执行生成多条错误,但TRY/CATCH仅捕获最后一条的问题,可通过查询sys.dm_exec_session_errors动态管理视图获取当前会话的所有错误记录,具体实现如下:
核心原理
SQL Server会将当前会话产生的所有错误(包括单条语句触发的多个错误)记录在sys.dm_exec_session_errors中,而TRY/CATCH块中的ERROR_*系列函数仅能返回触发CATCH的最后一条错误信息。通过查询该视图,可提取出所有关联的错误详情。
示例代码
DROP SCHEMA IF EXISTS AlreadyExists GO CREATE SCHEMA AlreadyExists GO PRINT '------------------------------------------------------' -- 可选:清理当前会话之前的错误记录,避免干扰 DELETE FROM sys.dm_exec_session_errors WHERE session_id = @@SPID; BEGIN TRY DECLARE @sql NVARCHAR(MAX) = N'CREATE SCHEMA AlreadyExists'; EXEC sp_executesql @sql; END TRY BEGIN CATCH -- 查询当前会话的所有错误信息 SELECT error_number AS 错误编号, error_message AS 错误信息, error_severity AS 严重级别, error_state AS 状态码 FROM sys.dm_exec_session_errors WHERE session_id = @@SPID ORDER BY error_time DESC; END CATCH
执行输出
------------------------------------------------------ 错误编号 错误信息 严重级别 状态码 2759 CREATE SCHEMA 因先前的错误而失败。 16 0 2714 数据库中已存在名为'AlreadyExists'的对象。 16 6
注意事项
- 权限要求:查询
sys.dm_exec_session_errors需要VIEW SERVER STATE权限,若当前账号无此权限,需联系管理员授权。 - 会话隔离:
@@SPID代表当前会话ID,确保只会查询当前执行流程产生的错误,不会混入其他会话的错误记录。 - 版本兼容:该方案支持SQL Server 2016及2019版本,
sys.dm_exec_session_errors在SQL Server 2008及以后版本均可用。 - 错误清理:示例中添加了清理当前会话历史错误的语句,若需要保留历史错误,可移除该步骤,但需注意过滤错误时间范围,避免获取无关错误。
内容的提问来源于stack exchange,提问作者Matthew Baker
相关产品推荐
相关产品推荐

