读书人

zjcxc(邹建)的ntext字段的替换处理示

发布时间: 2012-02-27 10:00:22 作者: rapoo

zjcxc(邹建)的ntext字段的替换处理示例
下面是邹建给出的存储过程:

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

--测试数据
create table test(id varchar(3),txt ntext)
insert into test
select '1 ', 'abc我是中a国人
deaf;sdakj21432
我要处理中文 '
go

--定义替换的字符串
declare @s_str varchar(8000),@r_str varchar(8000)
select @s_str= '
' --要替换的字符串
,@r_str= ' <P> ' --替换成的字符串

--替换处理
declare @id int,@ptr varbinary(16)
declare @start int,@s nvarchar(4000),@len int
declare @s_str1 nvarchar(4000),@s_len int,@i int,@step int

select @s_str1=reverse(@s_str),@s_len=len(@s_str)
,@step=case when len(@r_str)> len(@s_str)
then 4000/len(@r_str)*len(@s_str)
else 4000 end

declare tb cursor local for
select id,start=charindex(@s_str,[txt])-1
from [test]
where charindex(@s_str,[txt])> 0
--这里可以定义要处理的记录的条件

open tb
fetch tb into @id,@start
while @@fetch_status=0
begin
select @ptr=textptr([txt])
,@s=substring([txt],@start+1,@step)
from [test]
where id=@id

while len(@s)> =@s_len
begin
select @len=len(@s),@i=charindex(@s_str1,reverse(@s))


if @i> 0
begin
select @i=case when @i> =@s_len then @s_len else @i end
,@s=replace(@s,@s_str,@r_str)
updatetext [test].[txt] @ptr @start @len @s
end
else
set @i=@s_len
select @start=@start+len(@s)-@i+1
,@s=substring([txt],@start+1,@step)
from [test]
where id=@id
end
fetch tb into @id,@start
end
close tb
deallocate tb
go

--显示处理结果
select * from test
go

--删除测试
drop table test

/*--测试结果

id txt
---- -----------------------------------------------
1 abc我是中a国人 <P> deaf;sdakj21432 <P> 我要处理中文

(所影响的行数为 1 行)
--*/

非常感谢,尝试是可行的,有一个问题:在哪里设定where条件?
文中有一个提示:
where charindex(@s_str,[txt])> 0
--这里可以定义要处理的记录的条件

不太明白,想讨个实例:
比如我只想修改表中id> 100的记录,是不是可以这样加条件:
直接把  where charindex(@s_str,[txt])> 0
改成:  where id> 100


谢谢了.

------解决方案--------------------


不太明白,想讨个实例:
比如我只想修改表中id> 100的记录,是不是可以这样加条件:
直接把  where charindex(@s_str,[txt])> 0
改成:  where id> 100

你是对的呀,你试试就会很明白了

他 where charindex(@s_str,[txt])> 0 这里的意思是指: @s_str里包含字符[txt]即执行.

CHARINDEX
返回字符串中指定表达式的起始位置。

读书人网 >SQL Server

热点推荐