替代SQL Server 2005中的复杂replace()函数

时间:2016-02-25 18:11:02

标签: sql-server tsql sql-server-2005

我被要求对具有26(!)嵌套Replace函数调用的SQL Server 2005查询做一些工作。

此查询存在两个问题。

首先,26个替换函数是不够的,还需要更多函数,但查询会遇到一些大小限制(它是一个存储过程及其使用sp_MSforEachDB)。

第二个问题是在这个阶段查询是不易读的。

我想将表变量与查找一起使用,但问题是替换查询用于将一列中的值替换为另一列中的值。然而,它确实起作用,显而易见的是没有替换足够的字符串。

这是一个简化的例子,希望能更好地解释我想要做的事情。

要转换的表

ID   MainText                         Ptext1    Ptext2     Ptext3
1    Have a %Ptxt1 %Ptxt2             Apple     Tonight    
2    %Ptxt1 likes %Ptxt2 at %Ptxt3    Sally     Cake       Midnight    

1的理想结果是#34;有Apple Apple Tonight",2的理想结果是" Sally Likes Cake at Midnight"。

当前的SQL看起来有点像

EXEC sp_MSForEachDB 'IF ''?'' LIKE ''%Database%''
Select Replace(Replace(Replace([Maintext], '%Ptxt1' , [Ptext1]),'%Ptxt2',[Ptext2]),'Ptxt3', [Ptext3]) from dbo.mytable  

请原谅示例中的任何错误。

我见过很多人使用Table变量存储替换函数参数的例子 - 但我还没有看到使用列引用而不是静态字符串的地方,这可能吗?

1 个答案:

答案 0 :(得分:0)

调用您的基表:MyData。 创建一个名为MyValues的新表(id,Token,data_value)。 ID是FK到您的基表。对于MyData中的每个记录,将字段名称的值插入MyValues。 所以,MyValues看起来像

Id        Token        data_value
====      ======       ==========
1         Ptxt1        Apple
1         Ptxt2        Tonight
2         Ptxt1        Sally
2         Ptxt2        Cake
2         Ptxt3        Midnight

依旧......

然后你可以将MyTable加入MyValues。

现在,解决问题的一种方法是在MyData和MyValues上的内循环上循环。

declare @i int
for each value in MyData
begin
  @i++
  read MyDaya.MainText into @mainText
  for each value in MyValues where ID = Id of the MainData
  begin
    read MyValues.data_value into @actualValue
    read MyValues.Token into @token
    @mainText = Replace(@mainText, @toekn, @actualValue)
    Update MyData with mainText or do what ever appropriate   
  end
end

这是伪代码,我希望你能在T-SQL中实现它