但是目前有许多现存系统仍然存在text类型的字段,因为种种原因已经不能修改数据库结构。
但是我们可以在新写的sql语句及存储过程中采用新的方法,以备将来mssql server抛弃专门针对text等类型的操作函数后修改程序的麻烦。
下面是一个简单的替换例子,
针对text类型的字符串替换:
设有表 t(id int not null,info text)
要求替换info中的'abc'为'123'
一般的存储过程会写成:
drop procedure dbo.procedure_1
go
set ansi_nulls on
set quoted_identifier on
go
create procedure dbo.procedure_1
as
declare @ptr varbinary(16)
declare @id int
declare @position int,@len int
declare @strsrc char(3)
declare @strdsc char(3)
set @strtmp='abc'
set @strdsc='123'
set @len=3
declare replace_cursor scroll cursor
for
select textptr([info]),id from t
for read only
open replace_cursor
fetch next from replace_cursor into @ptr,@id
while @@fetch_status=0
begin
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,@id
end
close replace_cursor
deallocate replace_cursor
go
其中用到了text专用的函数 updatetext
现在我们改写成
drop procedure dbo.procedure_1
go
set ansi_nulls on
set quoted_identifier on
go
create procedure dbo.procedure_1
as
declare @id int
declare @strtmp varchar(max)
declare @strsrc char(3),@strdsc char(3)
set @strsrc = 'abc'
set @strdsc = '123'
declare replace_cursor scroll cursor
for
select id from testtable
--for read only
open replace_cursor
fetch next from replace_cursor into @id
while @@fetch_status=0
begin
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 @id
end
close replace_cursor
deallocate replace_cursor
go
这样,无论info字段改成char,nchar,text都好,一样均可通用
新闻热点
疑难解答