首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

zjcxc(邹建)的ntext字段的替换处理示例,该怎么解决

2012-02-27 
zjcxc(邹建)的ntext字段的替换处理示例下面是邹建给出的存储过程:--ntext字段的替换处理示例--全表替换--

zjcxc(邹建)的ntext字段的替换处理示例
下面是邹建给出的存储过程:

--ntext字段的替换处理示例--全表替换      
       
    --测试数据      
    create       table       test(id       varchar(3),txt       ntext)      
    insert       into       test      
    select       '1 ', 'abc我是中a国人      
    deaf;sdakj21432      
    我要处理中文 '      
    go      
       
    --定义替换的字符串      
    declare       @s_str       varchar(8000),@r_str       varchar(8000)      
    select       @s_str= '      
    '       --要替换的字符串      
    ,@r_str= ' <P> '   --替换成的字符串      
       
    --替换处理      
    declare       @id       int,@ptr       varbinary(16)      
    declare       @start       int,@s       nvarchar(4000),@len       int      
    declare       @s_str1       nvarchar(4000),@s_len       int,@i       int,@step       int      
       
    select       @s_str1=reverse(@s_str),@s_len=len(@s_str)      
    ,@step=case       when       len(@r_str)> len(@s_str)      
    then       4000/len(@r_str)*len(@s_str)      
    else       4000       end      
       
    declare       tb       cursor       local       for          
    select       id,start=charindex(@s_str,[txt])-1      
    from       [test]      
    where       charindex(@s_str,[txt])> 0      
    --这里可以定义要处理的记录的条件      
       
    open       tb          
    fetch       tb       into       @id,@start      
    while       @@fetch_status=0      
    begin      
    select       @ptr=textptr([txt])      
    ,@s=substring([txt],@start+1,@step)      
    from       [test]      
    where       id=@id      
       
    while       len(@s)> =@s_len      
    begin      
    select       @len=len(@s),@i=charindex(@s_str1,reverse(@s))      


    if       @i> 0      
    begin      
    select       @i=case       when       @i> =@s_len       then       @s_len       else       @i       end      
    ,@s=replace(@s,@s_str,@r_str)      
    updatetext       [test].[txt]       @ptr       @start       @len       @s      
    end      
    else      
    set       @i=@s_len      
    select       @start=@start+len(@s)-@i+1      
    ,@s=substring([txt],@start+1,@step)      
    from       [test]      
    where       id=@id      
    end      
    fetch       tb       into       @id,@start      
    end      
    close       tb      
    deallocate       tb      
    go      
       
    --显示处理结果      
    select       *       from       test      
    go      
       
    --删除测试      
    drop       table       test      
       
    /*--测试结果      
       
    id               txt                                                                                                                                                                                      
    ----       -----------------------------------------------      
    1                   abc我是中a国人 <P> deaf;sdakj21432 <P> 我要处理中文      
       
    (所影响的行数为       1       行)      
    --*/

非常感谢,尝试是可行的,有一个问题:在哪里设定where条件?
文中有一个提示:
  where       charindex(@s_str,[txt])> 0      
    --这里可以定义要处理的记录的条件    

不太明白,想讨个实例:
比如我只想修改表中id> 100的记录,是不是可以这样加条件:
直接把      where       charindex(@s_str,[txt])> 0    
改成:      where     id> 100


谢谢了.

------解决方案--------------------


不太明白,想讨个实例:
比如我只想修改表中id> 100的记录,是不是可以这样加条件:
直接把  where charindex(@s_str,[txt])> 0
改成:  where id> 100

你是对的呀,你试试就会很明白了

他 where charindex(@s_str,[txt])> 0 这里的意思是指: @s_str里包含字符[txt]即执行.

CHARINDEX
返回字符串中指定表达式的起始位置。

热点排行