替换text字段

以下是测试环境,希望大家想办法替换下面表#TmpText中的TextField字段所有
a -- 》》 ab
看看有什么好办法。还希望不要粘帖以前的帖子的替换过程,因为下面已经建立好表了,在下面的环境中进行即可。大家一定要先测试再粘帖上来,谢谢。

-- 建立测试环境
CREATE TABLE #TmpText
(
TextField TEXT
)

INSERT INTO #TmpText VALUES(REPLICATE('a',4000) + REPLICATE('b',2000) + REPLICATE('ab',2000))

-- 以下是替换前
SELECT * FROM #TmpText

/*
这里写替换代码
*/

-- 以下是替换后
SELECT * FROM #TmpText

-- 删除测试表
DROP TABLE #TmpText

---------------------------------------------------------------

CREATE TABLE #TmpText
(
TextField TEXT
)

INSERT INTO #TmpText VALUES(REPLICATE('a',4000) + REPLICATE('b',2000) + REPLICATE('ab',2000))

declare @p varbinary(16),@position int,@i int
select @p=textptr(TextField),@position=(patindex('%a%',TextField))-1 from #TmpText

while @position>=0
begin
updatetext #TmpText.TextField
@p
@position
1
WITH LOG
'ab'
set @i=@position+len('ab')
select @position=(patindex('%a%',substring(TextField,@i+1,datalength(TextField)-@i)))-1 from #TmpText
IF @position>=0 set @position=@position+@i ---关键要判断,否则会无限制地循环

end

select datalength(TextField) from #tmpText
select substring(TextField,7989,30) from #TmpText
select substring(TextField,9989,30) from #TmpText

=====结果

-----------
13000

(1 row(s) affected)

------------------------------------------------------------
ababababababbbbbbbbbbbbbbbbbbb

(1 row(s) affected)

------------------------------------------------------------
bbbbbbbbbbbbabbabbabbabbabbabb

(1 row(s) affected)

---------------------------------------------------------------

NND,花了偶15分。。。
CREATE TABLE #TmpText
(
TextField TEXT
)
INSERT INTO #TmpText VALUES(REPLICATE('a',8) + REPLICATE('b',4) + REPLICATE('ab',4))
-- 以下是替换前
SELECT * FROM #TmpText
/*
这里写替换代码
*/
declare @p varbinary(16),@i int,@Pos int,@len int;
Select @p=TEXTPTR(TextField),@len=datalength(TextField) From #TmpText;
set @i=1;
set @pos=0;
while (1=1)
begin
Select @len=datalength(TextField) From #TmpText;
Select @i=patindex('%a%',substring(TextField,@i,@len-@i+1)) from #TmpText
if @i=0 break;
set @i=@i+@pos-1
UpdateText #TmpText.TextField @p @i 1 'ab';
set @i=@i + 1 + len('ab')-len('a');
set @pos=@i-1;
end
-- 以下是替换后
SELECT * FROM #TmpText

-- 删除测试表
DROP TABLE #TmpText

--------------------------------------------------------------
--没办法,还是改用patindex+substring
--下面这个是修改后的.

--text字段的替换处理示例--全表替换

--创建数据测试环境
create table test(id varchar(3),txt text)
insert into test
select '001',REPLICATE('a',4000) + REPLICATE('b',2000) + REPLICATE('ab',2000)
union all select '002',REPLICATE('a',4000) + REPLICATE('b',2000) + REPLICATE('ab',2000)
go
select datalength(txt),* from test

--定义替换的字符串
declare @s_str varchar(8000),@d_str varchar(8000)
select @s_str='a' --要替换的字符串
,@d_str='ab' --替换成的字符串

--因为只能用patindex,所以对于搜索字符串做处理
set @s_str='%'+@s_str+'%'

--定义游标,循环处理数据
declare @id varchar(3)
declare #tb cursor for select id from test
open #tb
fetch next from #tb into @id
while @@fetch_status=0
begin
--字符串替换处理
declare @p varbinary(16)
,@p1 int,@p2 int
,@rplen int,@step int,@len int

select @p=textptr(txt)
,@rplen=len(@s_str)-2
,@step=len(@d_str)
,@p1=patindex(@s_str,txt)
,@len=datalength(txt)
,@p2=0
from test where id=@id

while @p1>0
begin
set @p2=@p1+@p2-1
updatetext test.txt @p @p2 @rplen @d_str
select @p2=@p2+1,@p1=patindex(@s_str,substring(txt,@p2+1,@len))
from test where id=@id
end
fetch next from #tb into @id
end
close #tb
deallocate #tb

--显示结果
select datalength(txt),* from test

go
--删除数据测试环境
drop table test

Published At
Categories with 数据库类
Tagged with
comments powered by Disqus