to viptiger(六嘎) 不行 提示 对数据类型而言运算符无效。运算符为 add,类型为 ntext。
--text字段替换处理示例 --邹建 2004.07(引用请保留此信息)--测试数据 create table tb(id int identity(1,1),content ntext) insert tb select '001,002' union all select '001,002,003,004,005,006,007,008,009,010' go--替换处理 declare @s_str nvarchar(4000),@r_str nvarchar(4000) select @s_str='02' --要替换的字符串 ,@r_str='**02' --替换成该字符串--替换处理 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,[content])-1 from [tb] where id=2 --替换id=1的记录 and charindex(@s_str,[content])>0open tb fetch tb into @id,@start while @@fetch_status=0 begin select @ptr=textptr([content]) ,@s=substring([content],@start+1,@step) from [tb] where id=@idwhile 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 [tb].[content] @ptr @start @len @s end else set @i=@s_len select @start=@start+len(@s)-@i+1 ,@s=substring([content],@start+1,@step) from [tb] where id=@id end fetch tb into @id,@start end close tb deallocate tb go--显示处理结果 select * from tb go--删除测试 drop table tb/*--测试结果id content ----------- ---------------------------------------------- 1 001,002 2 001,0**02,003,004,005,006,007,008,009,010(所影响的行数为 2 行)--*/
DECLARE @ptrval binary(16)SELECT @ptrval = TEXTPTR(step1) FROM myabc where id =10210810 UPDATETEXT myabc.step1 @ptrval null 0 '10000'
不行
提示
对数据类型而言运算符无效。运算符为 add,类型为 ntext。
--text字段替换处理示例
--邹建 2004.07(引用请保留此信息)--测试数据
create table tb(id int identity(1,1),content ntext)
insert tb select '001,002'
union all select '001,002,003,004,005,006,007,008,009,010'
go--替换处理
declare @s_str nvarchar(4000),@r_str nvarchar(4000)
select @s_str='02' --要替换的字符串
,@r_str='**02' --替换成该字符串--替换处理
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,[content])-1
from [tb]
where id=2 --替换id=1的记录
and charindex(@s_str,[content])>0open tb
fetch tb into @id,@start
while @@fetch_status=0
begin
select @ptr=textptr([content])
,@s=substring([content],@start+1,@step)
from [tb]
where id=@idwhile 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 [tb].[content] @ptr @start @len @s
end
else
set @i=@s_len
select @start=@start+len(@s)-@i+1
,@s=substring([content],@start+1,@step)
from [tb]
where id=@id
end
fetch tb into @id,@start
end
close tb
deallocate tb
go--显示处理结果
select * from tb
go--删除测试
drop table tb/*--测试结果id content
----------- ----------------------------------------------
1 001,002
2 001,0**02,003,004,005,006,007,008,009,010(所影响的行数为 2 行)--*/
DECLARE @ptrval binary(16)SELECT @ptrval = TEXTPTR(step1)
FROM myabc
where id =10210810
UPDATETEXT myabc.step1 @ptrval null 0 '10000'