我有一个包含变量名称及其值的表variable
,例如:
另一个表expression
包含表达式:
我希望用它们的值替换表variable
中的变量,因此结果应为:
有没有办法用CTE做到这一点?
答案 0 :(得分:3)
这是一个很好的脑力训练师。这是递归CTE方法:
--using recursive CTE
with
subq (original, corrected, PassNum) as
(
select expression.expression as corrected, expression.expression as original, 1 as PassNum from expression
union all
select subq.original, cast(replace(subq.corrected, '#' + variable.name + '#', variable.value) as varchar(100)),
PassNum+1 as PassNum from subq, variable where subq.corrected like '%#' + variable.name + '#%'
)
update expression set expression.expression=subq.corrected from expression inner join subq on
expression.expression=subq.original where subq.passnum=(select max(passnum) from subq)
它有一些烦恼,比如你必须投射修正后的值,使其与列大小相匹配(详见下文),以及PassNum
变量,这是我唯一的方法找出哪个更新是最后一个。
平凡的游标方法可能更容易调试,因为它更直接:
--using cursor
DECLARE @name VARCHAR(50)
DECLARE @value VARCHAR(50)
DECLARE loopCursor CURSOR FOR
SELECT name, value from variable
OPEN loopCursor
FETCH NEXT FROM loopCursor INTO @name, @value
WHILE @@FETCH_STATUS = 0
BEGIN
update expression set expression.expression=replace(expression, '#' + @name + '#', @value)
FETCH NEXT FROM loopCursor INTO @name, @value
END
CLOSE loopCursor
DEALLOCATE loopCursor
这是我在使用递归CTE时发现的关于铸造的引用:
您所看到的行为是设计上的。虽然我们可以打字 列的派生和/或强制到公共类型,用于递归 CTE我们选择严格保持推导。还有一个角落 类型派生无法到达的情况 正确的精度/比例/长度。这可能会导致错误。 所以我们的建议就是明确键入any 表达式使用CAST。 -Umachandar,SQL可编程性团队[1]