--text字段的替换处理示例--全表替换--测试数据 create table test(id varchar(3),txt ntext) insert into test select '1','alsdkfjlkasdjflaksdf [abc] fsdk [abc] jfdsfsdf' go--定义替换的字符串 declare @s_str varchar(8000),@r_str varchar(8000) select @s_str='[abc]' --要替换的字符串 ,@r_str='[123]' --替换成的字符串--替换处理 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 intselect @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 enddeclare 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我是[中国的]国人,deaf;sdakj21432我要处理中文(所影响的行数为 1 行) --*/
select 字段=replace(字段,'[abc]','[123]') from tb如果更新
update tb set 字段=replace(字段,'[abc]','[123]')
会产生怎样的结果啊?
create table test(id varchar(3),txt ntext)
insert into test
select '1','alsdkfjlkasdjflaksdf [abc] fsdk [abc] jfdsfsdf'
go--定义替换的字符串
declare @s_str varchar(8000),@r_str varchar(8000)
select @s_str='[abc]' --要替换的字符串
,@r_str='[123]' --替换成的字符串--替换处理
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 intselect @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 enddeclare 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我是[中国的]国人,deaf;sdakj21432我要处理中文(所影响的行数为 1 行)
--*/
---- --------------------------------------------------
1 alsdkfjlkasdjflaksdf [123] fsdk [123] jfdsfsdf(所影响的行数为 1 行)
where a like '&[abc]&'
where a like '%[abc]%'