在MS SQL数据库中的所有行中查找特定单词并最终替换它

时间:2011-04-04 11:00:17

标签: sql sql-server-2008-r2

有没有办法扫描MS SQL 2008 R2数据库中的所有表并将一个单词替换为另一个单词?或者,如果无法替换,可能只列出具有特定单词的所有行(以及旁边的相应表格以供参考)?

如果不可能完全用SQL做,那么我也可以使用C#。

1 个答案:

答案 0 :(得分:1)

没有“开箱即用”的解决方案,但是编写执行此操作的存储过程并不是很难。

例如,下面的过程将循环遍历所有表,然后循环遍历varcharnvarchar类型的所有列,并将字符串@value替换为@newvalue 。这只是一个概念证明,可以通过添加一个where子句来检查字符串是否包含值,从而使其更快地得到增强。 (使用LIKE或使用全文索引)。

create proc ReplaceStrings(
        @value nvarchar(maX)
      , @newvalue nvarchar(max)
      )
AS
declare @table_id int
      , @name sysname
      , @fieldname sysname
      , @sql nvarchar(max)
      , @fields nvarchar(max)

if @value = ''
  begin
      raiserror('The search value can not be empty', 16, 1) 
      return (-1)
  end    
declare tab cursor read_only local
for
select object_id, name from sys.tables

open tab
fetch next from tab into @table_id, @name

while @@FETCH_STATUS = 0 
  begin

    SELECT @sql = N'UPDATE ' + QUOTENAME(@name) + ' 
                set '  
         , @fields = NULL
    declare field cursor read_only local
    for 
    select name from sys.columns where object_id = @table_id and system_type_id in (type_id('varchar'), type_id('nvarchar'))
    open field
    fetch next from field into @fieldname
    while @@FETCH_STATUS = 0
      begin
        set @fields = coalesce(@fields + ',', '') + N' ' + quotename(@fieldname) + '  = REPLACE(' + quotename(@fieldname) + ', @value, @newvalue)' 
        fetch next from field into @fieldname        
      end
    close field
    deallocate field

    set @sql += @fields 

    print @sql
    exec sp_executesql @sql , N'@value nvarchar(max), @newvalue nvarchar(max)', @value, @newvalue

    fetch next from tab into @table_id, @name
  end
close tab
deallocate tab

return (0)

调用以下程序:

exec ReplaceStrings 'haha', 'hihi'