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