You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

注意事项

  1. 权限要求:查询sys.dm_exec_session_errors需要VIEW SERVER STATE权限,若当前账号无此权限,需联系管理员授权。
  2. 会话隔离:@@SPID代表当前会话ID,确保只会查询当前执行流程产生的错误,不会混入其他会话的错误记录。
  3. 版本兼容:该方案支持SQL Server 2016及2019版本,sys.dm_exec_session_errors在SQL Server 2008及以后版本均可用。
  4. 错误清理:示例中添加了清理当前会话历史错误的语句,若需要保留历史错误,可移除该步骤,但需注意过滤错误时间范围,避免获取无关错误。

内容的提问来源于stack exchange,提问作者Matthew Baker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 20:27:18