这是一个替换.next 属性中某个字符串的语句.现在的这个语句执行一次.只能替换一条.请问如何.才行.让他多执行几次了.多替换几条啊.或是全部替换完.
语句如下:--替换处理定义
DECLARE @s_str nvarchar(1000),@r_str nvarchar(1000)
SELECT @s_str='123'  --要替换的字符串
 ,@r_str='000'  --替换成该字符串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+'%',aa),
@p=TEXTPTR(aa),
@s=SUBSTRING(aa,@start,@step),
@len=LEN(@s),
@last_repl=0
FROM tb
WHERE PATINDEX('%'+@s_str+'%',aa)>0
AND TEXTVALID('tb.aa',TEXTPTR(aa))=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.aa @p @pos @len @s
END
--获取下一个要处理的数据
SELECT @start=@start+LEN(@s)-@last_repl+1,
@s=SUBSTRING(aa,@start,@step),
@len=LEN(@s),
@last_repl=0
FROM tb
END
GO

解决方案 »

  1.   

    这是一个 SQL Server 2005 ntext字段的REPLACE处理的问题.
    是这样的情况.我想把数据库中某个字段中某些字符替换掉.上面这个语句.在执行的时候.每执行一次只能替换掉一条.现在我把替换全部的.请问.应该如何做呢?请各位大哥大姐们帮忙给想个办法.
    主体代码如下:
    --测试数据 
    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
    ---------