2015-04-07 3 views
0

У меня есть один SQL-запрос, который мне нужно запустить против ~ 25 разных баз данных, каждый из которых находится на отдельном SQL-сервере в сети. Запрос будет запускаться из одной центральной студии управления SQL-сервером, а 24 других экземпляра SQL-сервера связаны. У меня есть запрос, который мне нужен, и я тестировал его, но цель состоит в том, чтобы создать скрипт, который запрашивает каждый из 25 отдельных экземпляров SQL.Простой одиночный запрос SQL для нескольких связанных SQL-серверов/БД

Вместо того чтобы писать запрос из 25 отдельных раз в сценарии, мне интересно, есть ли способ использовать один блок кода для запроса каждого связанного экземпляра с использованием массива, переменных, DO/WHILE, функции или любого другого метода.

Вот запрос:

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 Studio), за исключением.

Конечной целью является вывод запрошенных данных для каждого экземпляра SQL в один .txt-файл; формат, напечатать имя каждого конкретного SQL-сервера, за которым следуют соответствующие запрошенные данные.

Любые советы относительно того, как можно выполнить такую ​​задачу?

Заранее спасибо.

+0

Это один ** запрос ** (не * querie *) и два или более ** запросов ** .... –

+0

Это был долгий день ... у вас есть полезное предложение для меня? – Matt

+0

Используйте режим SQLCMD и переменную для подключения к серверу. Фактически подключитесь к каждому из экземпляров, а не используйте связанный сервер, запустите запрос и подключитесь к следующему. – Rory

ответ

0

Ну, одним из способов было бы создать курсор для итерации всех связанных серверов. (Вы можете найти связанные серверы, как это ...)

SELECT * FROM sys.servers WHERE is_linked = 1 

Затем вы можете использовать недокументированные sp_MSForEachDB хранимую процедуру для запуска динамической версии запроса (изменение сервера на каждой итерации) на каждой базе данных в текущий сервер курсора. Если вы ищете sp_MSForEachDB, вы можете найти много информации. Но here's one link, чтобы сэкономить время.

+0

Благодарю вас, в настоящее время изучая, как я мог реализовать этот метод в своем коде. – Matt

Смежные вопросы