我有以下问题: 我需要用替换字符串替换某些字符串模式。使用Replace本身很容易,但我遇到的问题是字符串模式可以互相嵌套 例如:
Select 'p1' as param, 'P1-Value' as paramvalue into #paramvalues
Union
Select 'p2' as param, 'P2-Value' as paramvalue
Union
Select 'p3' as param, 'P3-Value except $p1$' as paramvalue
Union
Select 'p4' as param, 'P4-Value, $p1$,$p2$, $p3$' as paramvalue
表::
param paramvalue
p1 P1-Value
p2 P2-Value
p3 P3-Value execpt $p1$
p4 P4 Value, $p1$,$p2$,$p3$
现在我想用实际值替换字段paramvalue中的$param$
字符串模式。对于单个值,可以使用replace:
Select param, REPLACE(paramvalue,'$p1$',(Select paramvalue from #paramvalues a where param = 'p1'))
from #paramvalues b
param paramvalue
p1 P1-Value
p2 P2-Value
p3 P3-Value execpt P1-Value
p4 P4 Value, P1-Value,$p2$,$p3$
但它只会取代一级嵌套,也不会考虑更换的值。我曾想过使用嵌套的Replace
,但我想保持它的动态,所以添加新参数不需要重新编码。嵌套级别也没有定义为bevorhand(但我现在可以将其定义为三个以简化)。
我想我需要在CTE中使用一些递归SQL,但无法弄清楚是否能够正常工作。
最终结果集应如下所示:
param paramvalue
p1 P1-Value
p2 P2-Value
p3 P3-Value execpt P1-Value
p4 P4 Value, P1-Value,P2-Value,P3-Value execpt P1-Value
Sql Server:2008 R2
任何帮助表示赞赏
答案 0 :(得分:0)
您需要创建一个这样的函数,用它们的值替换参数。
这里还有SQL Fiddle demo
create function replace_params (@pvalue varchar(255))
returns varchar(255)
as
begin
declare @string_builder varchar(255) = ''
declare @temp_param varchar(255) = ''
declare @flag as int = 0
declare @i as int = 1
declare @chr char(1)
while (@i <= len(@pvalue))
begin
set @chr = substring(@pvalue, @i, 1)
if @flag = 1
begin
if @chr = '$'
begin
set @string_builder = @string_builder + (select top 1 dbo.replace_params(param_value) from params where param = @temp_param)
set @temp_param = ''
set @flag = 0
end
else
begin
set @temp_param = @temp_param + @chr
end
end
else
begin
if @chr = '$'
begin
set @flag = 1
end
else
begin
set @string_builder = @string_builder + @chr
end
end
set @i = @i + 1
end
return(@string_builder)
end
go