模拟字符串处理函数 stuff 处理 Ntext 字段

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_stuff]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)

drop procedure [dbo].[p_stuff]

GO

/*--Ntext字段处理

模拟字符串处理函数 stuff

完成表中 ntext 字段的 stuff 处理

注意,表中需要有列名为:id 的主键(或标识字段),数据类型为int

如果没有这个主键字段,或者是其他类型,则对应的需要修改存储过程

--邹建 2004.07--*/

/*--调用示例

--测试数据

create table tb(id int identity(1,1),content ntext)

insert tb select 'a;sd'

union all select 'a;sdfkjas2qasdfdfsg45yhjhdfg45645a'

--调用存储过程,将第8~9的字符替换成'中国'

exec p_stuff 'tb','content',8,2,'中国',''

select * from tb

drop table tb

--*/

create proc p_stuff

@tbname sysname, --要处理的表名

@fdname sysname, --text/ntext字段名

@start int=null, --开始位置,NULL表示追加数据

@length int=null, --替换的长度

@str nvarchar(4000),--要插入的字符串

@where nvarchar(1000)=''--要处理的记录的条件

as

if @str is null return

declare @s nvarchar(4000)

set @s='

declare @id int,@ptr varbinary(16),@start1 int

declare tb cursor local for

select id,start=datalength(['+@fdname+'])/2

from ['+@tbname+']

'+case isnull(@where,'') when '' then ''

else ' where '+@where end+'

open tb

fetch tb into @id,@start1

while @@fetch_status=0

begin

select @ptr=textptr(content)

from ['+@tbname+']

where id=@id

if @start is null or @start1<@start

updatetext ['+@tbname+'].['+@fdname+'] @ptr null null @str

else

begin

set @start1=@start-1

updatetext ['+@tbname+'].['+@fdname+'] @ptr @start1 @length @str

end

fetch tb into @id,@start1

end

close tb

deallocate tb

'

exec sp_executesql @s

,N'@start int,@length int,@str nvarchar(4000)'

,@start,@length,@str

go

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航