declare @w varchar(8000)
declare @t varchar(8000)
set @w='对象资源管理详细信息'
set @w=dbo.regexReplace(@w,'[^\u4e00-\u9fa5]','',1,1)
declare @tb table(w varchar(10),f int)
declare @i int
declare @l int
declare @theWord varchar(10)
set @l=2
while @l<5
begin
set @i=1
while @i<len(@w)
begin
set @theWord=substring(@w,@i,@l)
if  charindex(' ',@theWord)=0 begin
if   exists(select w from @tb where w=@theWord)
begin
update @tb set f=f+1 where w=@theWord
end
else
begin
insert @tb(w,f) select @theWord,1
end end
set @i=@i+1
end
set @l=@l+1
end
select text from dbo.dictionary where text in(select w from @tb where f>len(@w)/100)mssql

解决方案 »

  1.   

    regexReplace 這個函數內容是什麽?
      

  2.   

    USE [test]
    GO
    /****** 对象:  UserDefinedFunction [dbo].[regexReplace]    脚本日期: 01/11/2013 16:51:55 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER   function   [dbo].[regexReplace]   
      (   
      @source   varchar(5000),         --原字符串   
      @regexp   varchar(1000),         --正则表达式   
      @replace   varchar(1000),       --替换值   
      @globalReplace   bit   =   0,       --是否是全局替换   
      @ignoreCase   bit   =   0               --是否忽略大小写   
      )   
      returnS   varchar(1000)   AS   
      begin   
      declare   @hr   integer   
      declare   @objRegExp   integer   
      declare   @result   varchar(5000)   
        
      exec   @hr   =   sp_OACreate   'VBScript.RegExp',   @objRegExp   OUTPUT   
      IF   @hr   <>   0   begin   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      return   null   
      end   
      exec   @hr   =   sp_OASetProperty   @objRegExp,   'Pattern',   @regexp   
      IF   @hr   <>   0   begin   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      return   null   
      end   
      exec   @hr   =   sp_OASetProperty   @objRegExp,   'Global',   @globalReplace   
      IF   @hr   <>   0   begin   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      return   null   
      end   
      exec   @hr   =   sp_OASetProperty   @objRegExp,   'IgnoreCase',   @ignoreCase   
      IF   @hr   <>   0   begin   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      return   null   
      end     
      exec   @hr   =   sp_OAMethod   @objRegExp,   'Replace',   @result   OUTPUT,   @source,   @replace   
      IF   @hr   <>   0   begin   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      return   null   
      end   
      exec   @hr   =   sp_OADestroy   @objRegExp   
      IF   @hr   <>   0   begin   
      return   null   
      end   
        
      return   @result   
      end   一个正则替换函数
      

  3.   

    dictionary 這個表的結構和數據呢
      

  4.   

    create function fn_tb(@w varchar(8000))
    returns table as return
    (
    select text from dbo.dictionary
    where @w like '%'+text+'%'
    and (len(@w)-len(replace(@w,text,'')))/len(text) > len(@w)/100
    )
    goselect * from fn_tb('对象资源管理详细信息')
      

  5.   

    用游标,感觉速度巨慢,是不是我写错了,帮忙看下。。
    USE [test]
    GO
    /****** 对象:  UserDefinedFunction [dbo].[gkey]    脚本日期: 01/11/2013 16:33:02 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    ALTER   function   [dbo].[gkey]   
      (   
     
      @w   varchar(1000)  )   
      returnS   varchar(1000)   AS   
      begin   
      declare @t varchar(8000)
    declare @s varchar(8000)
    declare @k varchar(8000)
    set @w=dbo.regexReplace(@w,'[^\u4e00-\u9fa5]','',1,1)declare @tb table(w varchar(10),f int)
    declare @i int
    declare @l int
    declare @theWord varchar(10)
    set @l=2
    while @l<5
    begin
    set @i=1
    while @i<len(@w)
    begin
    set @theWord=substring(@w,@i,@l)
    if  charindex(' ',@theWord)=0 begin
    if   exists(select w from @tb where w=@theWord)
    begin
    update @tb set f=f+1 where w=@theWord
    end
    else
    begin
    insert @tb(w,f) select @theWord,1
    end end
    set @i=@i+1
    end
    set @l=@l+1
    end
    set @k=''
    Declare cur Cursor
    for 
    select text from dbo.dictionary where text in(select w from @tb)
    open cur
    declare @text sysname 
    fetch next from cur into @text 
    while(@@fetch_status=0)
    begin
    if (@k='')
    begin
    set @k=@k+@text
    end
    else
    begin
    set @k=@k+','+@text
    end
    fetch next from cur into @text 
    endclose cur
    deallocate curreturn @k
    end   
      

  6.   

    自行解决 加上 top 就好了,谢谢各位。