在多个数据库上执行 SQL 查询

新手上路,请多包涵

我知道我的帖子与论坛中其他帖子的标题非常相似,但我真的找不到我需要的答案。

这是我的问题,我的 Windows Server 上运行了一个 SQL Server。在我的 SQL Server 中,我有大约 30 个数据库。它们都具有相同的表和相同的存储过程。

现在,问题来了,我有一个巨大的脚本,需要在所有这些数据库中运行。我希望我能对我所有的数据库只做一次。

我尝试了一些方法,例如转到“查看”>>注册服务器>>本地服务器组>>新服务器注册。但是这个解决方案适用于很多服务器,而不是很多数据库。

我知道我可以通过输入数据库名称来做到这一点,但是查询真的很大,所以在所有数据库中运行需要很长时间。

有人知道这是否可能吗?

原文由 Arturio 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 934
2 个回答

ApexSQL Propagate 是可以在这种情况下提供帮助的工具。它用于在多个数据库甚至多个服务器上执行单个或多个脚本。您应该做的只是选择该脚本,然后选择您要执行该脚本的所有数据库:

选择数据库

当您加载脚本和数据库时,您只需单击“执行”按钮并等待结果:

点击执行按钮

原文由 SteRO 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用以下脚本在一组数据库上运行相同的脚本。只需更改 插入 行中的过滤器。


declare @dbs table (
  dbName varchar(100),
  done bit default 0
)

insert @dbs select [name], 0 FROM master.dbo.sysdatabases WHERE [Name] like 'targets_%'

while (exists(select 1 from @dbs where done = 0))
begin
  declare @db varchar(100);
  select top 1 @db = dbName from @dbs where done = 0;
  exec ('
    use [' + @db + '];
    update table1 set
      col1 = '''',
      col2 = 1
    where id = ''45b6facb-510d-422f-a48c-687449f08821''
  ');
  print @db + ' updated!';
  update @dbs set done = 1 where dbName = @db;
end

如果您的 SQL Server 版本不支持表变量,只需使用临时表,但不要忘记在脚本末尾删除它们。

原文由 Andre Morata 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进