421 votes

Sélection de données à partir de deux serveurs différents dans SQL Server

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 ?

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 :)

377voto

Eric Points 35647

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.

23 votes

Peut-on le faire sans serveurs liés ?

6 votes

@Eric, Où se trouve Server Objects dans SSMS ?

11 votes

@TsahiAsher - Lorsque vous vous connectez à un serveur, Server Objects est un dossier dans l'arbre de l'explorateur d'objets.

111voto

Raging Bull Points 8696

Suivez ces étapes pour créer un serveur lié :

  1. Ojbects du serveur->Serveurs liés->Nouveau serveur lié

  2. Fournir le nom du serveur distant.

  3. Sélectionnez le type de serveur distant (SQL Server ou autre).

  4. Sélectionnez Sécurité->Faire avec ce contexte de sécurité et fournissez le login et le mot de passe du serveur distant.

  5. 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

1 votes

Note : voir ici pour savoir comment faire pour que le nom du serveur soit autre chose que le nom d'hôte/port.

2 votes

Une petite astuce, ici, si vous avez des problèmes avec le sp_addlinkedserver. Créez le serveur dans la boîte de dialogue - assurez-vous qu'il fonctionne - puis faites un clic droit sur la connexion et sélectionnez le scrip[t linked server AS create.

27voto

RSolberg Points 17001
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...

2 votes

Cette méthode fonctionnera-t-elle toujours ? Quels sont les scénarios où elle pourrait échouer ?

4 votes

J'ai confirmé que cela échoue dans mon environnement, l'erreur dit que je devais utiliser addlinkedserver.

1 votes

Est-ce que cela fonctionne pour tout le monde, sans utiliser un serveur lié ?

25voto

super9 Points 4574

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 :

  1. Serveurs liés : Fournir un accès à une plus grande variété de sources de données que ne le permet la réplication SQL Server.
  2. Serveurs liés : Connectez-vous aux sources de données que la réplication ne prend pas en charge ou qui nécessitent un accès ad hoc.
  3. Serveurs liés : Meilleures performances que OPENDATASOURCE ou OPENROWSET
  4. OPENDATASOURCE et OPENROWSET fonctions : Pratique pour récupérer des données à partir de sources de données sur une base ad hoc. OPENROWSET dispose également de fonctions BULK qui peuvent nécessiter ou non un fichier de format, ce qui peut être compliqué.
  5. OPENQUERY : Ne supporte pas les variables
  6. Tous sont des solutions T-SQL. Relativement faciles à mettre en œuvre et à configurer
  7. Tous dépendent de la connexion entre la source et la destination, ce qui peut affecter les performances et l'évolutivité.

0 votes

OPENQUERY nécessite toujours un serveur lié, alors que OPENDATASOURCE ne le fait pas.

18voto

Anna Karthi Points 31

Essayez ceci :

SELECT * FROM OPENROWSET('SQLNCLI', 'Server=YOUR SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a
UNION
SELECT * FROM OPENROWSET('SQLNCLI', 'Server=ANOTHER SERVER;Trusted_Connection=yes;','SELECT * FROM Table1') AS a

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