如何获取SQL参数表中多层嵌套引用参数的最终实际值
嵌套参数引用展开解决方案
这类场景的标准名称一般为 嵌套参数引用解析 或 变量依赖链展开,是参数配置表的常见需求,递归CTE完全可以实现该需求,以下是适配你测试用例的实现方案:
实现代码
DECLARE @T TABLE ( ParameterName NVARCHAR(128) NULL, ParameterValue NVARCHAR(128) NULL ) INSERT @T VALUES ( '$A', 'SOME VALUE'), ( '$B', '$A'), -- 可自行添加多层嵌套测试用例验证 ( '$C', '$B'), ( '$D', '$C + EXTRA STRING') ;WITH RecursiveCTE AS ( -- 锚点:读取所有参数初始值,记录递归深度避免环形引用死循环 SELECT ParameterName, ParameterValue AS FinalValue, 0 AS RecursionLevel FROM @T UNION ALL -- 递归:替换当前值中存在的参数引用 SELECT r.ParameterName, CAST(REPLACE(r.FinalValue, t.ParameterName, t.ParameterValue) AS NVARCHAR(128)), r.RecursionLevel + 1 FROM RecursiveCTE r INNER JOIN @T t ON r.FinalValue LIKE N'%' + t.ParameterName + N'%' -- 可根据实际业务的最大嵌套层级调整深度限制 WHERE r.RecursionLevel < 10 ) -- 取每个参数完全展开后的最终结果 SELECT DISTINCT ParameterName, LAST_VALUE(FinalValue) OVER ( PARTITION BY ParameterName ORDER BY RecursionLevel ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) AS FinalValue FROM RecursiveCTE ORDER BY ParameterName
代码说明
- 锚点成员读取所有参数的初始值,同时记录递归层数,避免出现
$A引用$B、$B又引用$A的环形引用导致死循环 - 递归成员每次匹配当前值中存在的参数名,替换为对应的参数值,直到没有可替换的引用为止
- 最终用窗口函数取每个参数递归到最深层的结果,就是完全展开后的最终值
运行结果(针对你给出的基础测试用例)
| ParameterName | FinalValue |
|---|---|
| $A | SOME VALUE |
| $B | SOME VALUE |
内容的提问来源于stack exchange,提问作者Pouya Kamyar
相关产品推荐
相关产品推荐

