--測(cè)試數(shù)據(jù)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--替換處理參數(shù)設(shè)置SELECT --用于要判斷每次截取數(shù)據(jù),最后一個(gè)被替換數(shù)據(jù)位置的處理@s_len=LEN(@s_str),--設(shè)置每次應(yīng)該截取的數(shù)據(jù)的長(zhǎng)度,防止REPLACE后數(shù)據(jù)溢出@step=CASE WHEN LEN(@r_str)>LEN(@s_str)THEN 4000/LEN(@r_str)*LEN(@s_str)ELSE 4000 END--替換處理的開(kāi)始位置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--得到最后一個(gè)被替換數(shù)據(jù)的位置WHILE CHARINDEX(@s_str,@s,@last_repl)>0SET @last_repl=@s_len+CHARINDEX(@s_str,@s,@last_repl)--如果需要,更新數(shù)據(jù),同時(shí)判斷下一個(gè)取數(shù)位置的偏移量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--獲取下一個(gè)要處理的數(shù)據(jù)SELECT @start=@start+LEN(@s)-@last_repl+1,@s=SUBSTRING(col,@start,@step),@len=LEN(@s),@last_repl=0FROM tbENDGO--顯示處理結(jié)果SELECT datalength(col),* FROM tbDROP TABLE tb |