我被要求对具有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变量存储替换函数参数的例子 - 但我还没有看到使用列引用而不是静态字符串的地方,这可能吗?
答案 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中实现它