134 votes

Interrogation des données en joignant deux tables dans deux bases de données sur des serveurs différents

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?

111voto

Scott Anderson Points 7522

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.

8voto

Essaye ça:

 SELECT tab2.column_name  
FROM  [DB1.mdf].[dbo].[table_name_1] tab1 INNER JOIN [DB2.mdf].[dbo].[table_name_2]  tab2   
    ON tab1.col_name = tab2.col_name
 

5voto

HLGEM Points 54641

Si votre base de données n’autorise pas un serveur lié, vous pouvez utiliser OPENROWSET. Books Online vous fournira la syntaxe dont vous avez besoin.

5voto

Dave Points 323

Du point de vue pratique de l'entreprise, la meilleure pratique consiste à créer une copie en miroir de la table de base de données dans votre base de données, puis à simplement la mettre à jour avec une tâche / proc chaque heure.

1voto

Abdulmoeed Points 1

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.

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