Сценарий SQL Server 2005 с объединением через серверы баз данных - PullRequest
3 голосов
/ 27 апреля 2010

У меня есть следующий скрипт, который я использую, чтобы дать мне простой «diff» между таблицами в двух разных базах данных. (Примечание: на самом деле мое сравнение гораздо больше, чем просто идентификация)

SELECT
    MyTableA.MyId,
    MyTableB.MyId
FROM
    MyDataBaseA..MyTable MyTableA
FULL OUTER JOIN
    MyDataBaseB..MyTable MyTableB
ON
    MyTableA.MyId = MyTableB.MyId
WHERE
    MyTableA.MyId IS NULL
OR
    MyTableB.MyId IS NULL

Теперь мне нужно запустить этот скрипт для двух баз данных, которые существуют на разных серверах. На данный момент мое решение - сделать резервную копию базы данных с одного сервера, восстановить ее на другом, а затем запустить скрипт.

Я почти уверен, что это возможно, однако, может ли это быть банкой червей? Это очень редкая задача, которую мне нужно выполнить, и если она требует большого количества изменений настроек БД, я, вероятно, буду придерживаться своего метода резервного копирования.

Ответы [ 2 ]

1 голос
/ 27 апреля 2010

Если вы настроили связанный сервер в SQL, вы можете просто выполнить обычный запрос, например, так. Это предполагает, что MyDatabaseB находится на удаленном сервере, к которому вы настроили связанный сервер, и запрос выполняется на сервере, на котором есть MyDatabaseA.

SELECT
MyTableA.MyId,
MyTableB.MyId
FROM
MyDataBaseA..MyTable MyTableA
FULL OUTER JOIN
LinkedServerName.MyDataBaseB.dbo.MyTable MyTableB
ON
MyTableA.MyId = MyTableB.MyId
WHERE
MyTableA.MyId IS NULL
OR
MyTableB.MyId IS NULL
0 голосов
/ 27 апреля 2010

Я бы тоже порекомендовал SSIS. Имеют два источника данных: один, который select ID from MyTableA order by ID, и тот, который select ID from MyTableB order by ID. ORDER BY важен, и вам нужно зайти в расширенный редактор и пометить вывод как отсортированный по ID в обоих источниках. Затем подключите эти два источника к преобразованию слиянием и укажите тип полного объединения. Затем вы подключаете выходные данные объединения в преобразование с условным разделением и отделяете строки с ненулевыми идентификаторами A и B от тех, которые имеют NULL в идентификаторе A или B. Эти последние будут вашим 'diff'.

По моему опыту, поскольку размер таблицы будет увеличиваться, решение служб SSIS будет становиться все более привлекательным, поскольку план, созданный для распределенного запроса, станет неуправляемо неэффективным.

...