web-dev-qa-db-fra.com

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

Comment sélectionner des données d'une même requête à partir de deux bases de données différentes situées sur deux serveurs différents dans SQL Server?

302
Don Of Qau

Oui, vous pouvez.

Je pense que vous demandez comment, alors je vais répondre à cela.

Ce que vous recherchez, ce sont des serveurs liés. Vous pouvez y accéder dans SSMS à partir de l'emplacement suivant dans l'arborescence de l'explorateur d'objets:

Server Objects-->Linked Servers

ou vous pouvez utiliser sp_addlinkedserver .

Vous n'avez qu'à en créer un. Une fois que vous avez cela, 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.

306
Eric

Vous pouvez le faire en utilisant le serveur lié.

Les serveurs liés sont généralement configurés pour permettre au moteur de base de données d'exécuter une instruction Transact-SQL incluant des tables dans une autre instance de SQL Server ou un autre produit de base de données tel que Oracle. De nombreux types OLE des sources de données de base de données peuvent être configurés en tant que serveurs liés, notamment Microsoft Access et Excel. 

Les serveurs liés offrent les avantages suivants:

  • La possibilité d'accéder aux données en dehors de SQL Server.
  • Possibilité d'émettre des requêtes, des mises à jour, des commandes et des transactions distribuées sur des sources de données hétérogènes dans l'entreprise.
  • La capacité à traiter diverses sources de données de la même manière.

En savoir plus sur Serveurs liés .

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

  1. Objets Serveur -> Serveurs liés -> Nouveau serveur lié

  2. Indiquez le nom du serveur distant.

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

  4. Sélectionnez Sécurité -> Être créé en utilisant ce contexte de sécurité et indiquez le nom d'utilisateur et le mot de passe du serveur distant.

  5. Cliquez sur OK et vous avez terminé!

Here est un tutoriel simple pour créer un serveur lié.

OU 

Vous pouvez ajouter un serveur lié à l'aide de la requête.

Syntaxe:

sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ] 
     [ , [ @provider= ] 'provider_name' ]
     [ , [ @datasrc= ] 'data_source' ] 
     [ , [ @location= ] 'location' ] 
     [ , [ @provstr= ] 'provider_string' ] 
     [ , [ @catalog= ] 'catalog' ] 

En savoir plus sur sp_addlinkedserver .

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
85
Raging Bull
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

Vous pouvez également utiliser des serveurs liés. Les serveurs liés peuvent également être d'autres types de sources de données, telles que les plates-formes DB2. Il s'agit d'une méthode pour essayer d'accéder à DB2 à partir d'un appel SQL Server TSQL ou Sproc ...

24
RSolberg

La requête sur 2 bases de données différentes est une requête distribuée. Voici une liste de certaines techniques ainsi que des avantages et des inconvénients:

  1. Serveurs liés: Fournit un accès à une plus grande variété de sources de données que la réplication SQL Server
  2. Serveurs liés: Se connecter avec des 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: Performent mieux que OPENDATASOURCE ou OPENROWSET
  4. OPENDATASOURCEetOPENROWSETfunctions: Pratique pour récupérer des données à partir de sources de données sur une base ad hoc. OPENROWSET a également des installations BULK qui peuvent nécessiter un fichier de format qui pourrait être fiddley.
  5. OPENQUERY: Ne supporte pas les variables
  6. Tous sont des solutions T-SQL. Relativement facile à mettre en œuvre et à configurer
  7. Tous dépendent de la connexion entre la source et la destination qui peut affecter les performances et l'évolutivité
21
super9

essaye ça:

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
14
Anna Karthi

Ce sont toutes de bonnes réponses, mais celle-ci manque et elle a ses propres utilisations puissantes. Peut-être que cela ne correspond pas à ce que le PO voulait, mais la question était vague et je sens que d’autres pourraient trouver leur chemin ici. Fondamentalement, vous pouvez utiliser 1 fenêtre pour exécuter simultanément une requête sur plusieurs serveurs, voici comment:

Dans SSMS, ouvrez Registered Servers et créez un Nouveau groupe de serveurs sous Groupes de serveurs locaux

Dans ce groupe, créez Nouvel enregistrement de serveur pour chaque serveur que vous souhaitez interroger. Si les noms de base de données sont différents, veillez à définir une valeur par défaut pour chacun dans les propriétés.

Revenez maintenant au groupe que vous avez créé à la première étape, cliquez avec le bouton droit de la souris et sélectionnez Nouvelle requête. Une nouvelle fenêtre de requête s'ouvrira et toute requête que vous exécuterez sera exécutée sur chaque serveur du groupe. Les résultats sont présentés dans un seul ensemble de données avec un nom de colonne supplémentaire indiquant le serveur d'où provient l'enregistrement. Si vous utilisez la barre d'état, vous remarquerez que le nom du serveur est remplacé par multiple .

13
Paul

J'ai eu le même problème pour connecter un SQL_server 2008 à un SQL_server 2016 hébergé sur un serveur distant. Les autres réponses n'ont pas fonctionné de manière directe. J'écris ma solution modifiée ici car je pense que cela pourrait être utile à quelqu'un d'autre.

Une réponse étendue pour les connexions à la base de données IP distantes:

Étape 1: serveurs de liens

EXEC sp_addlinkedserver @server='SRV_NAME',
   @srvproduct=N'',
   @provider=N'SQLNCLI',   
   @datasrc=N'aaa.bbb.ccc.ddd';

EXEC sp_addlinkedsrvlogin 'SRV_NAME', 'false', NULL, 'your_remote_db_login_user', 'your_remote_db_login_password'

... où SRV_NAME est un nom de fantaisie. Nous allons l'utiliser pour faire référence au serveur distant à partir de nos requêtes. aaa.bbb.ccc.ddd est l'adresse IP du serveur distant hébergeant votre base de données SQLserver.

Étape 2: Exécutez vos requêtes Par exemple:

SELECT * FROM [SRV_NAME].your_remote_db_name.dbo.your_table

...et c'est tout!

Détails de la syntaxe: sp_addlinkedserver et sp_addlinkedsrvlogin

6
MarcM

Server 2008:

Dans SSMS, connectez-vous à server1.DB1 et essayez:

SELECT  * FROM
[server2].[DB2].[dbo].[table1]

comme d'autres l'ont fait remarquer, si cela ne fonctionne pas, c'est que le serveur n'est pas lié.

Je reçois l'erreur: 

Impossible de trouver le serveur DB2 dans sys.servers. Vérifiez que le correct Le nom du serveur a été spécifié. Si nécessaire, exécutez la procédure stockée sp_addlinkedserver pour ajouter le serveur à sys.servers.

Pour ajouter le serveur:

reference: Pour ajouter un serveur à l'aide de sp_addlinkedserverLink: [1]: Pour ajouter un serveur à l'aide de sp_addlinkedserver

Pour voir ce qu'il y a dans vos serveurs.sys, il suffit de l'interroger:

SELECT * FROM [sys].[servers]
4
user3586922

A créé une définition de serveur lié d’un serveur à l’autre (vous avez besoin de SA pour le faire), puis faites-les simplement référence à un nom en 4 parties (voir BOL).

3
RBarryYoung
 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
2
Masum

Solution simplifiée pour l'ajout de serveurs liés

Premier serveur

EXEC sp_addlinkedserver @server='ip,port\instancename'

Deuxième connexion

EXEC sp_addlinkedsrvlogin 'ip,port\instancename', 'false', NULL, 'remote_db_loginname', 'remote_db_pass'

Exécuter des requêtes de la base de données liée à la base de données locale

INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]
0
irfandar

Je sais que c'est une vieille question mais j'utilise des synonymes. Soi-disant, la requête est exécutée dans le serveur de base de données A et recherche une table dans un serveur de base de données B qui n'existe pas sur le serveur A. Ajoutez ensuite un synonyme sur une base de données qui appelle votre table à partir du serveur B. Votre requête n'a pas à inclure tous les schémas, ou différents noms de base de données, appelez simplement le nom de la table comme d'habitude et cela fonctionnera.

Il n'est pas nécessaire de lier les serveurs car les synonymes sont en quelque sorte des liens.

0
Niklas Henricson
sp_addlinkedserver('servername')

alors ça devrait aller comme ça -

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
0
ugio

Comme @ Super9 a parlé d’OPENDATASOURCE utilisant l’authentification SQL Server avec le fournisseur de données SQLOLEDB. Je viens de poster ici un extrait de code pour une table se trouve dans la base de données du serveur actuel où le code est en cours d'exécution et un autre dans un autre serveur '192.166.41.123'

SELECT top 2 * from dbo.tblHamdoonSoft  tbl1 inner JOIN  
OpenDataSource('SQLOLEDB','Data Source=192.166.41.123;User ID=sa;Password=hamdoonsoft')
.[TestDatabase].[dbo].[tblHamdoonSoft1] tbl2 on tbl1.id = tbl2.id
0

Objets serveur ---> serveur lié ---> nouveau serveur lié

Dans le serveur lié, écrivez le nom du serveur ou l'adresse IP d'un autre serveur, puis choisissez SQL Server. 

Maintenant connecté, utilisez

Select * from [server name or ip addresses ].databasename.dbo.tblname
0
Sameh