3 votes

SQL Server 2005 script avec jointure entre serveurs de bases de données

J'ai le script suivant que j'utilise pour me donner une simple "diff" entre des tables sur deux bases de données différentes. (Note : En réalité, ma comparaison porte sur bien plus qu'un simple ID)

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

Je dois maintenant exécuter ce script sur deux bases de données qui existent sur des serveurs différents. Pour l'instant, ma solution consiste à sauvegarder la base de données d'un serveur, à la restaurer sur l'autre, puis à exécuter le script.

Je suis presque sûr que c'est possible, mais est-ce que cela risque d'être une boîte de Pandore ? C'est une tâche très rare que j'ai besoin d'effectuer et si elle implique un grand nombre de modifications des paramètres de la base de données, je m'en tiendrai probablement à ma méthode de sauvegarde.

1voto

D.K. Mulligan Points 2272

Si vous configurez un serveur lié dans SQL, vous pouvez simplement exécuter une requête ordinaire comme ceci. Cela suppose que MyDatabaseB se trouve sur le serveur distant sur lequel vous avez configuré le serveur lié et que la requête est exécutée sur le serveur qui contient 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

0voto

Remus Rusanu Points 159382

Moi aussi, je recommanderais plutôt SSIS. J'ai deux sources de données, l'une qui select ID from MyTableA order by ID et une qui select ID from MyTableB order by ID . Le ORDER BY est important, et vous devrez aller dans l'éditeur avancé et marquer la sortie comme triée par ID dans les deux sources. Branchez ensuite ces deux sources dans une transformation Merge Join et spécifiez qu'il s'agit d'un type de jointure complet. Ensuite, vous branchez la sortie de la jointure dans une transformation de fractionnement conditionnel et séparez les lignes avec des ID A et B non NULL de celles qui ont NULL sur l'ID de A ou de B. Ces dernières seront votre "diffraction". Ces dernières seront votre "diff".

D'après mon expérience, au fur et à mesure que la taille de la table augmente, la solution SSIS devient de plus en plus attrayante car le plan généré pour la requête distribuée devient ingérablement inefficace.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X