当前位置: 代码迷 >> Sql Server >> text类型中信息的替换有关问题
  详细解决方案

text类型中信息的替换有关问题

热度:104   发布时间:2016-04-27 14:02:33.0
text类型中信息的替换问题
使用一下这个方法进行替换但是charindex无法找到我要替换内容的位置。
已经确认要替换的内容确实存在,但是就是找不到。
在使用PATINDEX进行查找时会找到一个位置,但是此位置不是实际对应的位置。无法完成替换
例如PATINDEX的到的数是17000,执行后替换了这个位置的数据,但是我要替换的数据在这个数值之后。
不知道这个数值是怎样找到的,为什么会出现偏差?
求高手解答。。。。。

--SQL Server TEXT类型字段字符串替换示例处理脚本

/*--text字段的替换处理  
  --*/  
  --创建数据测试环境  
--create table #tb(aa text)
declare @s_str varchar(8000),@d_str varchar(8000), --定义替换的字符串 
  @p varbinary(16),@postion int,@rplen int,@i_Start int, @i_End int

select identity(int,1,1) as [id],newsid into # from news
select @i_Start=min([id]),@i_End=max([id]) from #
while (@i_Start<[email protected]_End)
begin 
  --insert into #tb(aa) select content from # where [id][email protected]_Start
  select @s_str='\' --要替换的字符串  
  ,@d_str='!' --替换成的字符串  
  --字符串替换处理  
  select @p=textptr(content),@rplen=len(@s_str),@postion=charindex(@s_str,content)-1 from news where newsid in (select top 1 newsid from # where [id][email protected]_Start) 
  while @postion>0  
  begin  
  updatetext news.content @p @postion @rplen @d_str  
  select @postion=charindex(@s_str,content)-1 from news where newsid in (select top 1 newsid from # where [id][email protected]_Start)
  end 
  --truncate table #tb
 
  select @[email protected]_Start+1
end

------解决方案--------------------
写一个替换函数,论坛里好像是有的,自己搜一下。
------解决方案--------------------
SQL code
[MSSQLServer]Text类型的字符串替换ntext, text, and image data types will be removed in a future version of MicrosoftSQL Server. Avoid using these data types in new development work, and plan to modify applications that currently use them. Use nvarchar(max), varchar(max), and varbinary(max) instead 从上文可以看到text,ntext等类型将会被ms sqlserver抛弃,取而代之的是varchar(max)等.预计也将会取消专门针对text等类型的操作函数,例如textptr,updatetext等。 但是目前有许多现存系统仍然存在text类型的字段,因为种种原因已经不能修改数据库结构。但是我们可以在新写的sql语句及存储过程中采用新的方法,以备将来mssql server抛弃专门针对text等类型的操作函数后修改程序的麻烦。下面是一个简单的替换例子, 针对text类型的字符串替换: 设有表 T(id int not null,info text)要求替换info中的'abc'为'123'一般的存储过程会写成:drop procedure dbo.procedure_1goset ANSI_NULLS ONset QUOTED_IDENTIFIER ONgocreate procedure dbo.procedure_1asdeclare @ptr varbinary(16)declare @ID intdeclare @Position int,@len intdeclare @strsrc char(3)declare @strdsc char(3)set @strtmp='abc'set @strdsc='123'set @len=3declare replace_Cursor scroll Cursorfor select textptr([info]),id from Tfor read onlyopen replace_Cursorfetch next from replace_Cursor into @ptr,@IDwhile @@fetch_status=0begin    select @Position=patindex([email protected]+'%',[info]) from T where [email protected]    while @Position>0    begin        set @[email protected]        updatetext T.[info] @ptr @Position @len @strdsc      select @Position=patindex([email protected]+'%',[info]) from T where [email protected]    end    fetch next from replace_Cursor into @ptr,@IDendclose replace_Cursordeallocate replace_Cursorgo参考 其中用到了text专用的函数 updatetext 现在我们改写成drop procedure dbo.procedure_1go set ANSI_NULLS ONset QUOTED_IDENTIFIER ONgo create procedure dbo.procedure_1as declare @ID intdeclare @strtmp varchar(max)declare @strsrc char(3),@strdsc char(3)set @strsrc = 'abc'set @strdsc = '123'declare replace_Cursor scroll Cursorfor select id from testtable--for read onlyopen replace_Cursorfetch next from replace_Cursor into @IDwhile @@fetch_status=0begin    select @strtmp = [info] from testtable where [email protected]    select @strtmp = Replace(@strtmp,@strsrc,@strdsc)    update T set [info] = @strtmp where [email protected]    fetch next from replace_Cursor into @IDendclose replace_Cursordeallocate replace_Cursorgo 这样,无论info字段改成char,nchar,text都好,一样均可通用
  相关解决方案