针对多个链接的SQL服务器/ DB运行单个SQL查询

时间:2015-04-07 18:20:48

标签: sql sql-server database sql-server-2008

我有一个SQL查询需要针对~25个不同的数据库运行 - 每个数据库都驻留在网络上的单独SQL服务器上。查询将从单个中央SQL服务器管理工​​作室运行,并且其他24个SQL服务器实例已链接。我有我需要的查询,并且我测试了它的工作原理 - 但目标是创建一个查询25个独立SQL实例中的每一个的脚本。

我想知道是否有办法利用单个代码块来使用数组,变量,DO / WHILE,函数来查询每个链接的实例,而不是在脚本中单独写出25个查询。或任何其他方法。

以下是查询:

SET NOCOUNT ON

PRINT 'local server';
SELECT isc.ini_schema_name[Device], count(*) [Count]
FROM pharos.dbo.edi_pharos_stations eps, pharos.dbo.ini_schemas isc
WHERE eps.ini_schema_id = isc.ini_schema_id
GROUP BY isc.ini_schema_id, isc.ini_schema_name

出于本示例的目的,如果我使用不那么优雅的方法多次写出代码块24,这将是脚本中的下一个查询(查询SQL服务器主机名为pharos90-2008)

PRINT 'Pharos90-2008';
SELECT isc.ini_schema_name[Device], count(*) [Count]
FROM [pharos90-2008].pharos.dbo.edi_pharos_stations eps, [pharos90-2008].pharos.dbo.ini_schemas isc
WHERE eps.ini_schema_id = isc.ini_schema_id
GROUP BY isc.ini_schema_id, isc.ini_schema_name

正如您所看到的,查询/代码完全相同,只是它引用了一个单独的链接SQL Server(从中央SQL Server Management Studio运行查询)。

最终目标是将每个SQL实例的查询数据输出到单个.txt文件中;格式化,打印每个特定SQL服务器的名称,后跟相应的查询数据。

关于如何完成这项任务的任何建议?

提前致谢。

1 个答案:

答案 0 :(得分:0)

好吧,一种方法是创建一个游标来迭代所有链接的服务器。 (你可以找到像这样的链接服务器......)

SELECT * FROM sys.servers WHERE is_linked = 1

然后,您可以使用未记录的sp_MSForEachDB存储过程在游标的当前服务器中的每个数据库上运行查询的动态版本(在每次迭代时更改服务器)。如果搜索sp_MSForEachDB,可以找到大量信息。但是here's one link可以节省时间。