日期:2014-05-18  浏览次数:20519 次

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

--鞫刻&#50024;&#48270;
SELECT * FROM tb
DROP TABLE tb
/*--&#50024;&#48270;
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 ' --要新插入的文