--测试数据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 tbUPDATETEXT tb.col @p NULL 0 tb.col @pGO--替换处理定义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 intDECLARE @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=0FROM tbWHERE PATINDEX('%'+@s_str+'%',col)>0AND TEXTVALID('tb.col',TEXTPTR(col))=1WHILE @len>=@s_lenBEGIN--得到最后一个被替换数据的位置WHILE CHARINDEX(@s_str,@s,@last_repl)>0SET @last_repl=@s_len+CHARINDEX(@s_str,@s,@last_repl)--如果需要,更新数据,同时判断下一个取数位置的偏移量IF @last_repl=0SET @last_repl=@s_lenELSEBEGINSELECT @last_repl=CASEWHEN @len<@last_repl THEN 1WHEN @len-@last_repl>=@s_len THEN @s_len ELSE @len-@last_repl+2 END,@s=REPLACE(@s,@s_str,@r_str),@pos=@start-1UPDATETEXT TB.col @p @pos @len @sEND--获取下一个要处理的数据SELECT @start=@start+LEN(@s)-@last_repl+1,@s=SUBSTRING(col,@start,@step),@len=LEN(@s),@last_repl=0FROM tbENDGO--显示处理结果SELECT datalength(col),* FROM tbDROP TABLE tb |