本帖最后由 royalwzy 于 2011-07-22 14:39:10 编辑

解决方案 »

  1.   


    declare @T table (col varchar(6))
    insert into @T
    select 'YY1000' union all
    select '歪*歪' union all
    select 'yY' union all
    select 'YY' union all
    select '歪歪' union all
    select 'yy'declare @p varchar(8000);
    set @p='YY1000kk歪歪998歪*歪9'declare @sql varchar(8000)
    set @sql='declare @sql varchar(8000)' +char(13)+'set @sql='''+@p+''''
    select @sql=@sql+char(13)+'set @sql=replace(@sql,'''+col+''''+','''')' from @T 
    set @sql=@sql+'select @sql'
    exec(@sql) 
    /*
    kk9989
    */
      

  2.   

    哈哈,我刚好处理过关键字。
    我把代码贴给你吧
    CREATE FUNCTION [dbo].[scan] (@msg varchar(255))  
    RETURNS int 
    AS  
    BEGIN 
    declare @rnt int
    declare @key varchar(255)
    set @rnt=0
    DECLARE abc CURSOR FOR select keyword from DPMO_keyword  --keyword 就是我们的关键字
    open abc 
    FETCH NEXT FROM abc into @key
    WHILE (@@FETCH_STATUS = 0)
    begin  
         set @rnt=CHARINDEX(@key,@msg) 
         if  (@rnt)>0
                begin
                break
                end
         FETCH NEXT FROM abc into @key
    end
    close abc
    DEALLOCATE abc以上是个函数返回的是关键字存在的位置 如果返回0  就没有包含关键字 
    return @rntEND
      

  3.   

      网上对于关键字过滤算法较多,且实现方法较多,本文主要介绍基于一种把关键字转换为Unicode,然后对关键字的字符或者单个关键字hash求值。算法复杂度为O(n)。    对于汉字的hash值的求法,因为是Unicode编码是16位,哈希求值:  /**//// 求汉字的哈希值
    long HashFun(wchar_t  word)
    {
     BYTE l = LOBYTE(word);
     int  h = HIBYTE(word); long num = h << 8 ;
     num +=l;
     return num;
    }    基本算法思想;    1.建立2个过滤关键字数组:数组1:为单个字符  数组2:为2个或者多个字符2.求出数组1,2的hash值,数组2的hash值只求出前2个字符的hash值即可。    3.扫描待检测的文本,然后每次取2个字符,查找数组2是否有匹配,如果没有则查找数组1……  查找为O(1)    主要代码如下:
    /**//*
       File :  WordFilter.cpp 
       brief:  关键字过滤程序,复杂度为O(n),线性
       Author: Expter
       Data  : 2009/06/30   对汉字或者字符进行哈希算法,先转换为unicode编码,然后求其hash值。   主要算法为:
       1.建立2个过滤关键字数组:数组1:为单个字符  数组2:为2个或者多个字符
       2.求出数组1,2的hash值,数组2的hash值只求出前2个字符的hash值即可。
       3.扫描待检测的文本,然后每次取2个字符,查找数组2是否有匹配,如果没有则查找数组1。  查找为O(1)
       不足:
       不能很好的分词。过滤不是很准确,每次只能1,2个词的过滤。
    */
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include   
    #include 
    using namespace std;wchar_t des1 [5][2] = { L"汉",L"字",L"测",L"试",L"个"};
    wchar_t des2 [3][5] = { L"用汉", L"的啥" ,L"测试啊"};
    wchar_t src[]  = { L"这个原来是打算的啥子东西用汉字只是一个是不是测试"};
    /**//// 求汉字的哈希值
    long HashFun(wchar_t  word)
    {
        BYTE l = LOBYTE(word);
        int  h = HIBYTE(word);    long num = h << 8 ;
        num +=l;
        return num;
    }long HashFun(wchar_t * word)
    {
        return HashFun(word[0])*10 + HashFun(word[1]);
    }
    void  ParamVer(map hashmp , wchar_t *src , int i)
    {
        long val = HashFun(src[i+1]);
        if(hashmp[val] == 1)
        {
            src[i+1] = L'*';
        }
    }
    void  VmAlorgthm(map hashmp,wchar_t *src)
    {
        long val = 0;
        int  m = wcslen(src) ;
        // O(n);
        for(int i = 0 ; i < m-1  ; i ++)
        {
            if( HashFun(src[i]) != L'*')
            {
                val = HashFun(src[i]) + HashFun(src[i+1]);
                if( hashmp[val] == 1)
                {
                    src[i] = L'*';
                    src[i+1] =L'*';
                }
                else
                {
                    val = HashFun(src[i]);
                    if(hashmp[val] == 1)
                    {
                        src[i] = L'*';
                    }
                    else
                    {
                        ParamVer(hashmp,src,i);
                    }
                }
            }
            else
            {
                ParamVer(hashmp,src,i+1);
            }
        }
        ParamVer(hashmp,src,m-1);
    }
    int _tmain(int argc, _TCHAR* argv[])
    {
        wcout.imbue(locale("chs"));     
        typedef map HASHMAP;    cout <<" 需要过滤文本: ";
        wcout<< src <     cout <<" 过滤关键字 : " ;
        for(int i = 0 ;i < 5; i++)
            wcout << des1[i][0] <<" ";
        wcout <     cout <<" 过滤关键词 : " ;
        for(int i = 0 ;i < 3; i++)
            wcout << des2[i] <<" ";
        wcout <     long  val = 0;    HASHMAP hash_map;
        /**//// 字 hash
        for(int i = 0 ; i < 5 ; i++)
        {
            val = HashFun(des1[i][0]);
            hash_map[val] = 1;
        }
        /**//// 词 hash
        for(int i =0 ; i < 3 ; i++)
        {
            val = HashFun(des2[i]);
            hash_map[val] = 1;
        }
        
        VmAlorgthm(hash_map,src);
        
        cout <<"\n-------------------------------------------------------------\n"
            <<" 过滤后的文本: ";
        wcout<< src <     return 0;
    }
      

  4.   

    先建一个关键字表
    然后对DESCRIBE字段进行REPLACE,再用关键字表循环替换REPLACE的内容,基本上就是2楼写的那样,改一下就可以了