有没有办法扫描MS SQL 2008 R2数据库中的所有表并将一个单词替换为另一个单词?或者,如果无法替换,可能只列出具有特定单词的所有行(以及旁边的相应表格以供参考)?
如果不可能完全用SQL做,那么我也可以使用C#。
答案 0 :(得分:1)
没有“开箱即用”的解决方案,但是编写执行此操作的存储过程并不是很难。
例如,下面的过程将循环遍历所有表,然后循环遍历varchar
和nvarchar
类型的所有列,并将字符串@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'