首页 / 数据库 / SQLServer / sqlserver 中ntext字段的批量替换(updatetext的用法)
一、问题描述:
1。在Sql Server 中,ntext/text/image 字段不允许应用replace函数替换内容;
2。通过convert字段转换,可以把ntext字段转换为varchar(8000),然后用Relpace函数替换,不过,此方法,对于字段长度大于8000的ntext字段无效。
二、问题解决
整理通用存储过程,代码如下:
复制代码 代码如下:
CREATE procedure [dbo].[Proc_UpdateNTextField]
@TargetTable nvarchar(1000), --目标表名
@TargetField nvarchar(1000), --目标字段名
@PKField nvarchar(1000), --该表主键字段名
@otxt nvarchar(1000), --需要替换的字符串
@ntxt nvarchar(1000) --替换后的字符串
as
begin
declare @SqlStr nvarchar(4000)
set @SqlStr = " declare @txtlen int "
set @SqlStr = @SqlStr + " set @txtlen = len(""" + @otxt + """) "
set @SqlStr = @SqlStr + " declare @pos int "
set @SqlStr = @SqlStr + " set @pos = 0 "
set @SqlStr = @SqlStr + "declare curs cursor local fast_forward for select "
set @SqlStr = @SqlStr + @PKField + " , textptr(" + @TargetField +") from " + @TargetTable +" where " + @TargetField + " like ""%" + @otxt +"%"""
set @SqlStr = @SqlStr + " declare @ptr binary(16) "
set @SqlStr = @SqlStr + " declare @id char(32) "
set @SqlStr = @SqlStr + " open curs "
set @SqlStr = @SqlStr + " fetch next from curs into @id, @ptr "
set @SqlStr = @SqlStr + " while @@fetch_status = 0 "
set @SqlStr = @SqlStr + " begin "
set @SqlStr = @SqlStr + " select @pos= patindex(""%" + @otxt + "%"",ProductDesc) from ProductTemp where ProductID=@id "
set @SqlStr = @SqlStr + " while @pos>0 "
set @SqlStr = @SqlStr + " begin "
set @SqlStr = @SqlStr + " set @pos=@pos-1 "
set @SqlStr = @SqlStr + " updatetext " + @TargetTable + "." +@TargetField + " @ptr @pos @txtlen """ + @ntxt + """ "
set @SqlStr = @SqlStr + " select @pos= patindex(""%" + @otxt + "%"",ProductDesc) from ProductTemp where ProductID=@id "
set @SqlStr = @SqlStr + " end "
set @SqlStr = @SqlStr + " fetch next from curs into @id, @ptr "
set @SqlStr = @SqlStr + " end "
set @SqlStr = @SqlStr + " close curs "
set @SqlStr = @SqlStr + " deallocate curs "
EXECUTE sp_executesql @SqlStr
end