这可能不是很有效,但它有效:
Declare @inputvalue varchar(max)
Set @inputvalue = 'Brussels sprout is one type of green veggie you should simply steam away without a doubt. Steaming your sprout will only enable a build up on your immunity. Raw Sproutbrussels or Brussels still has the cholesterol-lowering ability but as much as steamed brussels sprout. Likewise, here are some of the other health benefits of steaming brusselssprout ".
I like sprout, not Brussels.';
declare @word1 nvarchar(100) = 'brussels';
declare @word2 nvarchar(100) = 'sprout ';
with W1(id, pos, val) as (
Select 1, CHARINDEX(@word1, @inputvalue, 1)+1,
Case When
right(rtrim(left(@inputvalue, CHARINDEX(@word1, @inputvalue, 1)-1)), len(@word2)) = @word2
or left(ltrim(right(@inputvalue, len(@inputvalue) - CHARINDEX(@word1, @inputvalue, 1) - len(@word1) +1)), len(@word2)) = @word2
then @inputvalue else
left(@inputvalue, CHARINDEX(@word1, @inputvalue, 1) - 1)
end
Union All
Select id+1, CHARINDEX(@word1, val, pos)+1,
Case When
right(rtrim(left(val, CHARINDEX(@word1, val, pos)-1)), len(@word2)) = @word2
or left(ltrim(right(val, len(val) - CHARINDEX(@word1, val, pos) - len(@word1) +1)), len(@word2)) = @word2
then val else
left(val, CHARINDEX(@word1, val, pos) - 1)
+ right(val, len(val) - len(@word1) - CHARINDEX(@word1, val, pos) + 1)
end
From w1
Where CHARINDEX(@word1, val, pos) > 0
), W2(id, pos, val) as (
Select 1, CHARINDEX(@word2, val, 1)+1,
Case When
right(rtrim(left(val, CHARINDEX(@word2, val, 1)-1)), len(@word1)) = @word1
or left(ltrim(right(val, len(val) - CHARINDEX(@word2, val, 1) - len(@word2) +1)), len(@word1)) = @word1
then val else
left(val, CHARINDEX(@word2, val, 1) - 1)
end
From (
Select val From w1 Where id in (Select max(id) From w1)
) as w
Union All
Select id+1, CHARINDEX(@word2, val, pos)+1,
Case When
right(rtrim(left(val, CHARINDEX(@word2, val, pos)-1)), len(@word1)) = @word1
or left(ltrim(right(val, len(val) - CHARINDEX(@word2, val, pos) - len(@word2) +1)), len(@word1)) = @word1
then val else
left(val, CHARINDEX(@word2, val, pos) - 1)
+ right(val, len(val) - len(@word2) - CHARINDEX(@word2, val, pos) + 1)
end
From w2
Where CHARINDEX(@word2, val, pos) > 0
)
Select val From w2 Where id in (Select max(id) From w2)
Option (maxrecursion 0)
CTE W1 也可以放在函数中:
with W1(id, pos, val) as (
Select 1, CHARINDEX(@word1, @inputvalue, 1)+1,
Case When
right(rtrim(left(@inputvalue, CHARINDEX(@word1, @inputvalue, 1)-1)), len(@word2)) = @word2
or left(ltrim(right(@inputvalue, len(@inputvalue) - CHARINDEX(@word1, @inputvalue, 1) - len(@word1) +1)), len(@word2)) = @word2
then @inputvalue else
left(@inputvalue, CHARINDEX(@word1, @inputvalue, 1) - 1)
end
Union All
Select id+1, CHARINDEX(@word1, val, pos)+1,
Case When
right(rtrim(left(val, CHARINDEX(@word1, val, pos)-1)), len(@word2)) = @word2
or left(ltrim(right(val, len(val) - CHARINDEX(@word1, val, pos) - len(@word1) +1)), len(@word2)) = @word2
then val else
left(val, CHARINDEX(@word1, val, pos) - 1)
+ right(val, len(val) - len(@word1) - CHARINDEX(@word1, val, pos) + 1)
end
From w1
Where CHARINDEX(@word1, val, pos) > 0
)
Select val From w1 Where id in (Select max(id) From w1)
然后你只调用了两次:
Set @newvalue = replaceWords(replaceWords(@inputvalue, 'brussels', 'sprout'), 'sprout', 'brussels')
请注意,我喜欢球芽甘蓝!!! :)