Il y a deux tables dans deux bases de données différentes sur des serveurs différents, je dois les joindre afin de faire quelques requêtes. Quelles sont mes options? Que devrais-je faire?
Réponses
Trop de publicités?Vous aurez besoin d'utiliser sp_addlinkedserver
créer un lien de serveur. Voir la documentation de référence pour l'utilisation. Une fois que le serveur de connexion est établie, vous allez construire la requête comme normal, juste en préfixant le nom de base de données avec le serveur. I. E:
-- FROM DB1
SELECT *
FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN [DB2].[MyDatabaseOnDB2].[dbo].[MyOtherTable] tab2
ON tab1.ID = tab2.ID
Une fois le lien établi, vous pouvez également utiliser OPENQUERY
d'exécuter une instruction SQL sur le serveur distant et de ne transférer que les données de nouveau à vous. Cela peut être un peu plus rapide, et il va laisser le serveur distant optimiser votre requête. Si vous mettre en cache les données dans une mémoire temporaire (ou en mémoire) table sur DB1
dans l'exemple ci-dessus, alors vous serez en mesure de requête juste comme rejoindre une table standard. Par exemple:
-- Fetch data from the other database server
SELECT *
INTO #myTempTable
FROM OPENQUERY([DB2], 'SELECT * FROM [MyDatabaseOnDB2].[dbo].[MyOtherTable]')
-- Now I can join my temp table to see the data
SELECT * FROM [MyDatabaseOnDB1].[dbo].[MyTable] tab1
INNER JOIN #myTempTable tab2 ON tab1.ID = tab2.ID
Consultez la documentation pour OPENQUERY voir plus d'exemples. L'exemple ci-dessus est assez artificiel. Je n'hésiterais pas à utiliser la première méthode dans cet exemple précis, mais la deuxième option à l'aide de OPENQUERY
pouvez gagner du temps et de performance si vous utilisez la requête pour filtrer certaines données.
Une jointure de deux tables est mieux faite par un SGBD, elle devrait donc être faite de cette façon. Vous pouvez mettre en miroir la plus petite table ou un sous-ensemble de celle-ci sur l'une des bases de données, puis les joindre. On pourrait être tenté de le faire sur un serveur ETL comme Informatica, mais je suppose que ce n’est pas conseillé si les tables sont énormes.