text字段的替换问题,希望那位老师给指点迷津
表dict100_400有3个字段 ename,zhname,exname其中exname是TEXT类型,最长的文字达15000多,本来打算导入数据是用varchar(8000),结果发现失败,于是把exname改成TEXT类型了,但是现在遇到个问题:
数据库中数据是这样的,比如
exname zhname exname
----------------------------------
map 地图;测图 ~ controlled|地图定位,~ in roll|卷图,卷轴图,~ into|映入......
map的exname比较长 有15123字节
现在我怎么做才能把exname中的~替换为map就比如:
map controlled|地图定位,map in roll|卷图,卷轴图,map into|映入,
当然,数据库中5000条记录有100多条是这样,一句搞定最好了
[解决办法]
------邹老大的例子-----
CREATE TABLE tb(col text,col1 text,col2 text)
INSERT tb SELECT 'a ' ,NULL, 'c2 '
UNION ALL SELECT NULL, 'b2 ', 'c2 '
UNION ALL SELECT ' ' , 'b3 ',NULL
GO
--뫘劤뇹잿
DECLARE @p binary(16),@p1 binary(16),@p2 binary(16)
DECLARE tb CURSOR LOCAL
FOR
SELECT TEXTPTR(col),TEXTPTR(col1),TEXTPTR(col2) FROM tb
OPEN tb
FETCH tb INTO @p,@p1,@p2
WHILE @@FETCH_STATUS=0
BEGIN
IF TEXTVALID( 'tb.col ',@p)=0
BEGIN
UPDATE tb SET col= ' ' WHERE CURRENT OF tb
UPDATE tb SET @p=TEXTPTR(col) WHERE CURRENT OF tb
END
IF TEXTVALID( 'tb.col1 ',@p1)=1
BEGIN
UPDATETEXT tb.col @p NULL 0 ' <col1> '
UPDATETEXT tb.col @p NULL 0 tb.col1 @p1
UPDATETEXT tb.col @p NULL 0 ' </col1> '
END
IF TEXTVALID( 'tb.col2 ',@p2)=1
BEGIN
UPDATETEXT tb.col @p NULL 0 ' <col2> '
UPDATETEXT tb.col @p NULL 0 tb.col2 @p2
UPDATETEXT tb.col @p NULL 0 ' </col2> '
END
FETCH tb INTO @p,@p1,@p2
END
CLOSE tb
DEALLOCATE tb
GO
--鞫刻써벎
SELECT * FROM tb
DROP TABLE tb
/*--써벎
col col1 col2
-------------------------------------- ----------------------- ----------------------
a <col2> c2 </col2> NULL c2
<col1> b2 </col1> <col2> c2 </col2> b2 c2
<col1> b3 </col1> b3 NULL
--*/
[解决办法]
是sql server2005吗?
尝试用varchar(max)类型看看~
[解决办法]
看一下我写的
drop table att
create table att(id int ,atext Ntext)
insert into att select 1,N '~ controlled|地图定位,~ in roll|卷图,卷轴图,~ into|映入...... '
insert into att select 2,N '地图定位|映入...... '
insert into att select 3,N '~ controlled|地图定位,~~ into|映入...... '
declare @aa BINARY(16)
declare @i int
declare @id int
declare RepaceText cursor
for
select id,PATINDEX( '%~% ', atext) from att where PATINDEX( '%~% ', atext)> 0
open RepaceText
fetch next from RepaceText into @id,@i
while @@fetch_status=0
begin
--print @id
while @i> =0
begin
SELECT @aa = TEXTPTR(atext),
@i = PATINDEX( '%~% ', atext) - 1
FROM att
WHERE id = @id
--print @i
if @i> =0
begin
UPDATETEXT att.atext
@aa
@i --插入的位置
1 --删除的字符数
WITH LOG
'map ' --要新插入的文本
end
else
begin
break
end
end
fetch next from RepaceText into @id,@i
end
close RepaceText
deallocate RepaceText
--查看结果
select * from att
--
1map controlled|地图定位,map in roll|卷图,卷轴图,map into|映入......
2地图定位|映入......
3map controlled|地图定位,mapmap into|映入......
[解决办法]
create table #t(id int,Context text)
insert into #t select 1, 'zzzabczzz '
--如果长度大于8000,用如下语句
Declare @s_str varchar(8000), @d_str varchar(8000)
Select @s_str= 'abc ' , --要替换的字符串
@d_str= '110 ' --替换成的字符串
Declare @p varbinary(16),@postion int,@rplen int
Select @p=textptr(Context),@rplen=len(@s_str),@postion=charindex(@s_str,Context)-1 from #t
while @postion> =0
begin
updatetext #t.Context @p @postion @rplen @d_str
select @postion=charindex(@s_str,Context)-1 from #t
end
select * from #t
drop table #t
/*
idContext
--------------------------
1zzz110zzz
*/