sql2005,替换所有表中所有字段的值,(一把双刃剑)

创建这两个存储过程,然后运行最后的sql语句。

 

Create proc ReplaceKeyWord
@old nvarchar(100),
@new nvarchar(100)
as
declare @sql nvarchar(1000)
set @sql=N' 
declare   @s   nvarchar(4000),@tbname   sysname 
select   @s=N'''',@tbname=N''?'' 
select   @s=@s+N'',''+quotename(a.name)+N''=replace(''+quotename(a.name)+N'',N'''''+@old+''''',N'''''+@new+''''')'' 
from   syscolumns   a,systypes   b 
where   a.id=object_id(@tbname)   
and   a.xusertype=b.xusertype 
and   b.name   like   N''%char'' 
if   @@rowcount>0 
begin 
set   @s=stuff(@s,1,1,N'''') 
exec(N''update   ''+@tbname+''   set   ''+@s
end '
--print @sql
exec   sp_msforeachtable   @sql;

set @sql=N' 
declare   @s   nvarchar(4000),@tbname   sysname 
select   @s=N'''',@tbname=N''?'' 
select   @s=@s+quotename(a.name)+N'',''
from   syscolumns   a,systypes   b 
where   a.id=object_id(@tbname)   
and   a.xusertype=b.xusertype 
and   b.name   like   N''%text''
 if   @@rowcount>0 
begin 
exec UpdateTextColumn @tbname,@s,'''+@old+''','''+@new+'''
end
' ;
exec   sp_msforeachtable @sql
go

 

 

==================================================================

 

Create proc UpdateTextColumn
 @Table varchar(100),
 @Columns varchar(200),
 @old varchar(100),
 @new varchar(100)
 as
     set nocount on
     declare @sql nvarchar(2000)
     declare @Column varchar(50)
    declare @cpos int,@npos int
    declare @curoffset int
    set @cpos=1;
    set @npos=1;
    set @npos=charindex(',',@Columns,@cpos);
    set @curoffset=0;

   --------------------
   -- www.uiok.net
   --------------------

    while(@npos>0)
    begin
        set @Column = substring(@Columns,@cpos,@npos-@cpos);
        set @cpos = @npos+1
        set @npos=charindex(',',@Columns,@cpos);
       
        set @sql = 'update '+@Table+' set '+@Column+'=replace(cast('+@Column+' as varchar(8000)),@old,@new) where Datalength('+@Column+')<=8000';
        EXECUTE sp_executesql @Sql,
                           N'@old varchar(100),@new varchar(100)',
                           @old,
                           @new
        declare @ptr binary(16) ,@offset int,@dellen int
       
        set @dellen = len(@old)
       
        set @offset = 1
        while @offset>=1
        begin
            if @curoffset<>0
               set @curoffset=@offset;
            set @offset = 0
            set @sql = 'select     top 1 @offset = PATINDEX(''%'+@old+'%'' , '+@Column+'), @ptr = textptr('+@Column+') from '+@Table+' where Datalength('+@Column+')>8000 and

'+@Column+' like ''%'+@old+'%''';
            EXEC sp_executesql @Sql,N'@offset int OUTPUT,@ptr binary(16) OUTPUT,@old varchar(100),@curoffset int',
                               @offset OUTPUT,@ptr OUTPUT,@old,@curoffset;

           if (@offset is not null) and (@offset > 0)
            begin
                set @offset = @offset-1

                set @sql='updatetext '+@Table+'.'+@Column+' @ptr @offset @dellen @new';
                EXEC sp_executesql @Sql,N'@offset int ,@ptr binary(16),@dellen int,@new varchar(100)',@offset,@ptr,@dellen,@new;
            end
        end
end

 


Exec ReplaceKeyWord '被替换的字符串','要替换的字符串'

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值