跨多数据库获取存储过程参数元数据的通用方法及相关问题咨询
问题解答
1. MSSQL 中 OUT 参数被标记为 INOUT 的原因
这是 MSSQL 元数据视图的固有实现逻辑,并非错误:MSSQL 里定义为 OUTPUT 的参数本身支持传入初始值,行为和 SQL 标准定义的 INOUT 参数完全一致,所以 information_schema.parameters 会统一返回 INOUT 作为 parameter_mode 的值。如果需要在 MSSQL 中精准区分用户定义的 OUTPUT 参数,可以关联系统表 sys.parameters,通过 is_output 字段判断,值为 1 即代表是标记了 OUTPUT 的参数。
2. 跨库获取参数元数据的实现方案
目前不存在完全通用、适配所有数据库的参数元数据查询语句,不同数据库对存储过程/函数的定义、元数据存储结构差异很大,必须做分支适配,但可以通过合理的架构设计实现上层业务代码无感知,满足「一套代码兼容多库」的需求:
- 抽象统一的参数元数据获取接口,例如定义
IProcedureParamProvider接口,暴露GetParams(string schema, string routineName)方法 - 分别实现不同数据库的提供类:
- MSSQL 侧可以调整查询语句做参数模式修正,示例如下:
SELECT p.data_type, p.parameter_name, p.ordinal_position, CASE WHEN sp.is_output = 1 THEN 'OUT' ELSE p.parameter_mode END AS parameter_mode FROM information_schema.routines r JOIN information_schema.parameters p ON r.specific_name = p.specific_name JOIN sys.parameters sp ON sp.object_id = OBJECT_ID(QUOTENAME(r.routine_schema) + '.' + QUOTENAME(r.routine_name)) AND sp.parameter_id = p.ordinal_position WHERE r.routine_schema = 'schema' AND r.routine_name = 'procedure_name' - PostgreSQL 侧直接沿用现有查询语句即可
- MSSQL 侧可以调整查询语句做参数模式修正,示例如下:
- 程序启动时根据当前使用的数据库类型,注册对应的提供类实现,上层代码统一调用接口方法,不需要感知底层适配逻辑
内容的提问来源于stack exchange,提问作者smnfa
相关产品推荐
相关产品推荐

