Sql 基于同一表中的值分析和替换列中的嵌套模式

Sql 基于同一表中的值分析和替换列中的嵌套模式,sql,sql-server-2008,sql-server-2008-r2,Sql,Sql Server 2008,Sql Server 2008 R2,我有以下问题: 我需要用替换字符串替换某些字符串模式。这本身很容易使用,但我有一个问题,字符串模式可以相互嵌套 例如: 表:: param paramvalue p1 P1-Value p2 P2-Value p3 P3-Value execpt $p1$ p4 P4 Value, $p1$,$p2$,$p3$ 现在我想用实际值替换字段paramvalue中的$param$字符串模式。对于单个值,可使用替换: Select param, R

我有以下问题: 我需要用替换字符串替换某些字符串模式。这本身很容易使用,但我有一个问题,字符串模式可以相互嵌套 例如:

表::

 param   paramvalue
 p1      P1-Value
 p2      P2-Value
 p3      P3-Value execpt $p1$
 p4      P4 Value, $p1$,$p2$,$p3$
现在我想用实际值替换字段paramvalue中的
$param$
字符串模式。对于单个值,可使用替换:

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


需要任何帮助时,您需要创建这样一个函数,用参数值替换参数

这里还有一个

create function replace_参数(@pvalue varchar(255))
返回varchar(255)
作为
开始
声明@string_builder varchar(255)=”
声明@temp_param varchar(255)=”
将@flag声明为int=0
将@i声明为int=1
声明@chr char(1)

while(@i)您需要使用CLR for regular expression将所有值替换为pattern match,或者循环每个值以替换为其参数使用正则表达式时,您是否有一个特别的示例?谢谢,它的工作原理与charme类似。从未想过使用递归函数。希望进行upvote,但声誉不足。抱歉
 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
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