如何不使用WITH RESULT SET获取存储过程的列名、类型等元数据
动态SQL存储过程批量提取入参/输出结构解决方案
你的核心需求是批量提取500+动态SQL实现的存储过程的入参定义、输出结果集的列名和类型,避免逐一定义WITH RESULT SET的高操作成本,以下是可落地的低侵入方案:
第一步:批量导出存储过程入参元数据
入参的定义默认存储在数据库系统表中,完全不需要修改现有存储过程,执行以下查询即可批量导出所有存储过程的入参信息:
SELECT p.name AS 存储过程名, par.name AS 参数名, t.name AS 参数类型, par.max_length AS 长度, par.precision AS 精度, par.is_output AS 是否输出参数, par.is_nullable AS 是否允许空值 FROM sys.procedures p INNER JOIN sys.parameters par ON p.object_id = par.object_id INNER JOIN sys.types t ON par.system_type_id = t.system_type_id WHERE p.type = 'P' AND p.is_ms_shipped = 0 ORDER BY p.name, par.parameter_id
查询结果可直接导出为Excel表格,作为入参部分的文档基础。
第二步:批量提取动态SQL输出结果集结构
动态SQL的结果集不会预存在系统表中,可通过系统自带的元数据解析功能批量提取,全程不会实际执行业务逻辑、不会修改数据:
- 如果你使用的是SQL Server 2012及以上版本,直接调用
sp_describe_first_result_set系统存储过程,即可解析指定存储过程的返回结果集结构 - 低版本SQL Server可使用
SET FMTONLY ON开关,在仅解析元数据的模式下调用存储过程获取结构
你可以写一个遍历脚本,自动对所有目标存储过程执行元数据解析,将结果存入自定义的元数据表中,示例解析代码如下:
-- 示例:解析单个存储过程的结果集结构 SELECT name AS 列名, system_type_name AS 列类型, is_nullable AS 是否允许空值, column_ordinal AS 列顺序 FROM sys.dm_exec_describe_first_result_set_for_object(OBJECT_ID('你的存储过程名'), 0)
注意:如果存储过程存在多分支返回不同结果集的情况,需要对应补充分支参数的赋值逻辑,分别提取不同场景下的结果集结构
第三步:自动生成开发文档
拿到入参、出参的全量元数据后,可直接通过SQL查询拼接成Markdown格式的文档内容,也可以导出到Excel后按照团队规范整理成统一的接口文档,全程不需要修改任何现有存储过程,仅需开发1次批量脚本即可完成所有500+存储过程的信息提取。
内容的提问来源于stack exchange,提问作者mahyafa
相关产品推荐
相关产品推荐

