动态SQL搜索&替换功能

时间:2012-09-11 12:26:49

标签: sql-server function dynamic replace

@dmarkez昨天问了一个问题,就在我点击Post Your Answer按钮之前,他删除了这个问题。我认为答案值得分享......他没有重新发布这个问题,所以我希望他不介意我重新发帖,以便我可以与其他尝试类似事情的人分享答案:

原标题

MS SQL函数来操作字符串

原始问题

我需要一个MS SQL函数,需要用前缀确定名称,然后将其与实际名称结合起来。

实现这一目标的最佳方法或功能是什么?

前缀名称:Te,De,Van,Dela,O,Mc,San,Los等......

示例输入/输出名称:

van dam te mora te-> vandam temora te

o mara dela cruz -> omara delacruz

mc arthur white o san miguel -> mcarthur white osanmiguel

moana te aro van dolf-> moana tearo vandolf

1 个答案:

答案 0 :(得分:0)

如果你把所有的搜索和&替换一个表中的值,然后您可以编写几行SQL来循环使用S& R值来修复名称。向prefix表添加更多S& R对很容易,因此您的S& R例程是动态的:

declare @prefix table (srch varchar(255), rplc varchar(255))
declare @names table (name varchar(255))

insert into @prefix
values ('te ', 'te'), ('de ', 'de'), ('van ', 'van'), ('dela ', 'dela'), ('san ', 'san'), ('o ', 'o'), ('mc ', 'mc'), ('los ', 'los')

insert into @names
values ('van dam te mora te'), ('o mara dela cruz'), ('mc arthur white o san miguel'), ('moana te aro van dolf')

while (1=1)
begin
  update n
  set    n.name = replace(n.name, p.srch, p.rplc)
  from   @names n,
         @prefix p
  where  (n.name like p.srch + '%') or (n.name like '% ' + p.srch + '%')

  if @@rowcount = 0
    break
end

select * from @names

请注意('san ', 'san')位于前缀表中的('o ', 'o')之前。这是因为在san之前必须替换o,或osanmiguelosan miguel保留{{1}}。因此,S& R的顺序很重要。您需要在前缀表中添加聚集索引,以正确排序S& R记录,以便S& R循环首先处理子前缀。