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

SQL Server中如何描述存储过程返回的多个结果集结构

多结果集元数据获取实现方案

你当前使用的sys.dm_exec_describe_first_result_set内置函数的设计定位就是仅返回T-SQL批处理/存储过程的第一个结果集元数据,因此无法直接拿到后续结果集信息,可选择以下两种适配方案:


方案1:循环调用sp_describe_first_result_set存储过程(推荐,SQL Server 2012及以上版本支持)

该存储过程是官方提供的结果集元数据查询接口,支持通过@result_set_id参数指定要查询的结果集序号(从0开始计数),你可以从0开始递增该参数循环调用,直到返回空结果即代表所有结果集已遍历完成。

示例代码:

查询第1个结果集元数据

EXEC sp_describe_first_result_set 
    @tsql = N'
select ''A'' as ColumnA, ''B'' as ColumnB, ''C'' as ColumnC
select ''D'' as ColumnA, ''E'' as ColumnB, ''F'' as ColumnC
', 
    @params = NULL, 
    @result_set_id = 0

查询第2个结果集元数据

EXEC sp_describe_first_result_set 
    @tsql = N'
select ''A'' as ColumnA, ''B'' as ColumnB, ''C'' as ColumnC
select ''D'' as ColumnA, ''E'' as ColumnB, ''F'' as ColumnC
', 
    @params = NULL, 
    @result_set_id = 1

返回结果的字段和sys.dm_exec_describe_first_result_set完全一致,你可以沿用之前关联sys.types映射类型的逻辑。


方案2:使用SET FMTONLY ON获取全量结果集元数据(兼容所有SQL Server版本,适配含临时表/动态SQL的复杂存储过程)

如果你的存储过程包含临时表、动态SQL等sp_describe_first_result_set无法解析的逻辑,可以使用该方案:开启FMTONLY开关后执行存储过程,SQL Server仅返回所有结果集的元数据,不会返回实际数据也不会执行数据变更操作(特殊逻辑建议套一层只读事务避免异常)。

示例代码:

SET FMTONLY ON;
GO
-- 此处替换为你的实际存储过程调用,参数传入实际要解析的入参值
EXEC 你的复杂存储过程 @参数1 = 'xxx', @参数2 = 123;
GO
SET FMTONLY OFF;

你可以在数据访问代码层通过NextResult类的方法遍历所有返回的结果集,逐个提取列的类型、长度、可空性等属性。


注意事项

  • 如果存储过程存在分支逻辑,不同入参返回的结果集数量/结构不同,需要传入对应场景的实际参数查询元数据,否则得到的结构会和实际执行结果不一致。
  • sp_describe_first_result_set无法解析包含本地临时表的存储过程,该场景请优先使用方案2。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 17:15:00