我必须做以下 30 次
使用 TSQL 连接到具有唯一 IP 的服务器下载表到临时表对临时表进行一些查询(相同查询 30 次)
最后联合所有表格以获得最终解决方案
循环或光标或其他方法会是更好的方法吗?我不想复制粘贴类似的 SQL 30 次,但这也是一种选择。
我目前正在使用链接服务器连接到每个服务器
我必须做以下 30 次
使用 TSQL 连接到具有唯一 IP 的服务器下载表到临时表对临时表进行一些查询(相同查询 30 次)
最后联合所有表格以获得最终解决方案
循环或光标或其他方法会是更好的方法吗?我不想复制粘贴类似的 SQL 30 次,但这也是一种选择。
我目前正在使用链接服务器连接到每个服务器
除非您使用注册服务器或中央管理服务器,否则在没有链接服务器的情况下连接到其他实例并不方便。
如果您已注册服务器或 CMS,则可以通过 SSMS 一次对组中的所有实例(或所有已注册的服务器)执行相同的查询(请参阅上面的链接)。但我不知道您是否可以在一个实例中将结果输出到单个表;您可能会被复制粘贴到 Excel 卡住。
如果您愿意使用 Powershell,该
dbatools
模块在Invoke-DbaQuery
.Invoke-DbaQuery -Query "select fields from table" -SqlInstance instance1,instance2,instance3
将返回一个表示查询结果的对象以及一个字段,该字段具有每个返回的记录来自的相应实例名称。从那里,您可以使用 过滤结果
Where-Object
,或者您可以使用 将结果复制到另一个实例中的表中Write-DbaDbDataTable
我认为比使用游标或循环更重要的是——毕竟它们是同一件事——还有其他几件事:
错误处理,因为如果您认为在 30 台不同的服务器上运行相同的查询很烦人,那么必须运行相同的查询 30 次,因为它在不同的点不断失败,这同样糟糕。
同样,无论您如何跨所选目标执行查询:如果它运行缓慢,则做出初步决定所带来的任何胜利都将是短暂的。等待一分钟完成一个查询已经够糟糕的了。将其乘以 30,好吧,我认为在数学中他们称之为“无聊”。
如果您想要获得最佳性能,那么使用
UNION ALL
运算符 30 次可能更有效,因为它比使用循环或游标更符合解决方案的关系。如果您不关心性能,那么实现循环将比实现游标更简单。尽管我不确定您打算如何动态更改从循环或游标中提取数据的服务器,除非您正在构建动态 SQL字符串然后在最后执行,或者您在程序中的意思是通过循环语。
正是针对这种情况,我编写了工具QueryLauncher
写在
PowerShell
.基本上,您将所有
.sql
文件放在一个文件夹中,QueryLauncher将为您运行这些文件。