Comment puis-je sélectionner des données dans la même requête à partir de deux bases de données différentes qui se trouvent sur deux serveurs différents dans SQL Server ?
Peut-on le faire sans serveurs liés ?
Comment puis-je sélectionner des données dans la même requête à partir de deux bases de données différentes qui se trouvent sur deux serveurs différents dans SQL Server ?
Oui, vous pouvez.
Je pense que vous demandez comment, alors je vais y répondre.
Ce que vous recherchez, ce sont les serveurs liés. Vous pouvez y accéder dans SSMS sous
Server Objects-->Linked Servers
ou vous pouvez utiliser sp_addlinkedserver .
Vous n'avez qu'à en configurer un. Une fois que vous l'avez, vous pouvez appeler une table sur l'autre serveur comme ceci :
select
*
from
LocalTable,
[OtherServerName].[OtherDB].[dbo].[OtherTable]
Notez que le propriétaire n'est pas toujours dbo
Veillez donc à le remplacer par le schéma que vous utilisez.
@TsahiAsher - Lorsque vous vous connectez à un serveur, Server Objects est un dossier dans l'arbre de l'explorateur d'objets.
Suivez ces étapes pour créer un serveur lié :
Ojbects du serveur->Serveurs liés->Nouveau serveur lié
Fournir le nom du serveur distant.
Sélectionnez le type de serveur distant (SQL Server ou autre).
Sélectionnez Sécurité->Faire avec ce contexte de sécurité et fournissez le login et le mot de passe du serveur distant.
Cliquez sur OK et vous avez terminé !
Ici est un tutoriel simple sur la façon de créer un serveur lié.
OU vous pouvez ajouter un serveur lié de manière programmatique. Syntaxe :
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
Lire la suite ici .
Vous devez créer le serveur lié une seule fois. Après avoir créé le serveur lié, nous pouvons l'interroger comme suit :
select * from LinkedServerName.DatabaseName.OwnerName.TableName
Note : voir ici pour savoir comment faire pour que le nom du serveur soit autre chose que le nom d'hôte/port.
SELECT
*
FROM
[SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]
Vous pouvez également envisager d'utiliser des serveurs liés. Les serveurs liés peuvent également être d'autres types de sources de données, comme les plates-formes DB2. Voici une méthode pour essayer d'accéder à DB2 à partir d'un appel TSQL ou Sproc du serveur SQL...
Cette méthode fonctionnera-t-elle toujours ? Quels sont les scénarios où elle pourrait échouer ?
J'ai confirmé que cela échoue dans mon environnement, l'erreur dit que je devais utiliser addlinkedserver.
L'interrogation de deux bases de données différentes est une interrogation distribuée. Voici une liste de quelques techniques ainsi que leurs avantages et inconvénients :
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.
8 votes
Les réponses d'Eric et de Raging Bull sont très utiles. J'ai pu l'utiliser pour copier des volumes massifs de données de DEV à PROD en réduisant les délais de 5 heures à 18 heures, à 17 secondes.
0 votes
@Eric, bravo pour avoir modifié une question marginalement ambiguë et en avoir fait une question de 170 reps :)