ntext字段的替换处理(摘自《中文版SQLServer2000开发与管理应用实例》)--测试数据
CREATE TABLE tb(col ntext)
INSERT tb VALUES(REPLICATE( '0001,0002,0003,0004,0005,0006,0007,0008,0009,0100,'
+'220000001,302000004,500200006,700002008,900002120,',800))
DECLARE @p binary(16)
SELECT @p=TEXTPTR(col) FROM tb
UPDATETEXT tb.col @p NULL 0 tb.col @p
GO--替换处理定义
DECLARE @s_str nvarchar(1000),@r_str nvarchar(1000)
SELECT @s_str='00'  --要替换的字符串
,@r_str='0000'  --替换成该字符串DECLARE @p varbinary(16)
DECLARE @start int,@s nvarchar(4000),@len int
DECLARE @s_len int,@step int,@last_repl int,@pos int--替换处理参数设置
SELECT 
--用于要判断每次截取数据,最后一个被替换数据位置的处理
@s_len=LEN(@s_str), --设置每次应该截取的数据的长度,防止REPLACE后数据溢出
@step=CASE WHEN LEN(@r_str)>LEN(@s_str)
THEN 4000/LEN(@r_str)*LEN(@s_str)
ELSE 4000 END--替换处理的开始位置
SELECT @start=PATINDEX('%'+@s_str+'%',col),
@p=TEXTPTR(col),
@s=SUBSTRING(col,@start,@step),
@len=LEN(@s),
@last_repl=0
FROM tb
WHERE PATINDEX('%'+@s_str+'%',col)>0
AND TEXTVALID('tb.col',TEXTPTR(col))=1
WHILE @len>=@s_len
BEGIN
--得到最后一个被替换数据的位置
WHILE CHARINDEX(@s_str,@s,@last_repl)>0
SET @last_repl=@s_len
+CHARINDEX(@s_str,@s,@last_repl) --如果需要,更新数据,同时判断下一个取数位置的偏移量
IF @last_repl=0
SET @last_repl=@s_len
ELSE
BEGIN
SELECT @last_repl=CASE
WHEN @len<@last_repl THEN 1
WHEN @len-@last_repl>=@s_len THEN @s_len 
ELSE @len-@last_repl+2 END,
@s=REPLACE(@s,@s_str,@r_str),
@pos=@start-1
UPDATETEXT TB.col @p @pos @len @s
END
--获取下一个要处理的数据
SELECT @start=@start+LEN(@s)-@last_repl+1,
@s=SUBSTRING(col,@start,@step),
@len=LEN(@s),
@last_repl=0
FROM tb
END
GO--显示处理结果
SELECT datalength(col),* FROM tb
DROP TABLE tb

解决方案 »

  1.   

    --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 intselect @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 enddeclare 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 行)
    --*/