我赞同 tsql 不适合此操作的评论,但如果您必须在数据库中执行此操作,这里是一个使用函数来管理多个替换语句的示例。
由于每个音符 (5-15) 中的标记数量相对较少且标记数量非常多 (10k-100k),因此我的函数首先从输入中提取标记作为潜在标记,并使用该集合加入您的查找 ( dbo.Token 下面)。在每个音符中寻找任何标记的出现是太多的工作。
我使用 50k 令牌和 5k 笔记做了一些性能测试,这个功能运行得非常好,在 <2 秒内完成(在我的笔记本电脑上)。请报告此策略对您的效果。
注意:在您的示例数据中,令牌格式不一致(##_#, ##_##, #_#
),我猜这只是一个错字,并假设所有令牌都采用 ##TokenName## 的形式。
--setup
if object_id('dbo.[Lookup]') is not null
drop table dbo.[Lookup];
go
if object_id('dbo.fn_ReplaceLookups') is not null
drop function dbo.fn_ReplaceLookups;
go
create table dbo.[Lookup] (LookupName varchar(100) primary key, LookupValue varchar(100));
insert into dbo.[Lookup]
select '##placeholder130##','Dog' union all
select '##myPlaceholder##','Cat' union all
select '##oneMore##','Cow' union all
select '##test##','Horse';
go
create function [dbo].[fn_ReplaceLookups](@input varchar(max))
returns varchar(max)
as
begin
declare @xml xml;
select @xml = cast(('<r><i>'+replace(@input,'##' ,'</i><i>')+'</i></r>') as xml);
--extract the potential tokens
declare @LookupsInString table (LookupName varchar(100) primary key);
insert into @LookupsInString
select distinct '##'+v+'##'
from ( select [v] = r.n.value('(./text())[1]', 'varchar(100)'),
[r] = row_number() over (order by n)
from @xml.nodes('r/i') r(n)
)d(v,r)
where r%2=0;
--tokenize the input
select @input = replace(@input, l.LookupName, l.LookupValue)
from dbo.[Lookup] l
join @LookupsInString lis on
l.LookupName = lis.LookupName;
return @input;
end
go
return
--usage
declare @Notes table ([Id] int primary key, notes varchar(100));
insert into @Notes
select 1, 'This is some notes ##placeholder130## this ##myPlaceholder##, ##oneMore##. End.' union all
select 2, 'Second row...just a ##test##.';
select *,
dbo.fn_ReplaceLookups(notes)
from @Notes;
回报:
Tokenized
--------------------------------------------------------
This is some notes Dog this Cat, Cow. End.
Second row...just a Horse.