首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

text字段的替换有关问题,希望那位老师给指点迷津

2012-01-28 
text字段的替换问题,希望那位老师给指点迷津表dict100_400有3个字段ename,zhname,exname其中exname是TEXT

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 ' --要新插入的文本



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
*/

热点排行