Sélection des données 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 sont sur deux serveurs différents dans SQL Server?

288
demandé sur Eric 2009-07-17 19:34:43

13 réponses

Oui, vous pouvez.

je pense que vous demandez comment, donc je vais répondre.

ce que vous recherchez sont des serveurs liés. Vous pouvez y accéder en SSMS depuis L'emplacement suivant dans l'arbre de L'Explorateur D'objets:

Server Objects-->Linked Servers

ou vous pouvez utiliser sp_addlinkedserver .

il suffit d'en installer un. Une fois que vous avez cela, vous pouvez composer un tableau de l'autre serveur comme ceci:

select
    *
from
    LocalTable,
    [OtherServerName].[OtherDB].[dbo].[OtherTable]

Notez que le propriétaire n'est pas toujours dbo , alors assurez-vous de le remplacer avec ce schéma que vous utilisez.

290
répondu Eric 2016-12-12 16:36:34

vous pouvez le faire en utilisant le serveur lié.

les serveurs typiquement liés sont configurés pour permettre au moteur de base de données d'exécuter une instruction Transact-SQL qui inclut des tables dans une autre instance de SQL Server, ou un autre produit de base de données tel que Oracle. De nombreux types de sources de données OLE DB peuvent être configurés comme des serveurs liés, y compris Microsoft Access et Excel.

les serveurs liés offrent les avantages suivants:

  • la possibilité d'accéder aux données à partir de L'extérieur du serveur SQL.
  • la capacité d'émettre des requêtes distribuées, des mises à jour, des commandes et des transactions sur des sources de données hétérogènes à travers l'entreprise.
  • la capacité de traiter de diverses sources de données de la même façon.

pour en savoir plus sur serveurs reliés .

Suivez ces étapes pour créer un Serveur Lié:

  1. Objets De Serveur -> Serveurs Liés -> Nouveau Serveur Lié

  2. Fournit Le Nom Du Serveur Distant.

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

  4. sélectionnez Sécurité -> faites en utilisant ce contexte de sécurité et fournir l'ouverture de session et le mot de passe du serveur distant.

  5. cliquez sur OK et vous avez terminé !!

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

ou

vous pouvez ajouter un serveur lié en utilisant query.

syntaxe:

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

plus d'informations à propos de sp_addlinkedserver .

vous devez créer serveur lié une seule fois . Après avoir créé le serveur lié, nous pouvons l'interroger comme suit:

select * from LinkedServerName.DatabaseName.OwnerName.TableName
82
répondu Raging Bull 2015-02-11 10:50:37
SELECT
        *
FROM
        [SERVER2NAME].[THEDB].[THEOWNER].[THETABLE]

vous pouvez également regarder en utilisant des serveurs liés. Les serveurs reliés peuvent être d'autres types de sources de données aussi comme les plates-formes DB2. C'est une méthode pour essayer d'accéder à DB2 à partir D'un appel TSQL ou Sproc SQL Server...

24
répondu RSolberg 2009-07-17 15:46:17

l'Interrogation sur 2 différentes bases de données est une requête distribuée. Voici une liste de quelques techniques plus les avantages et les inconvénients:

  1. serveurs liés: permettent d'accéder à une plus grande variété de sources de données que la réplication SQL Server fournit
  2. serveurs liés: Se connecter à des sources de données que la réplication ne supporte pas ou qui nécessitent un accès ad hoc
  3. serveurs liés: Perform better than OPENDATASOURCE or OPENROWSET
  4. OPENDATASOURCE and OPENROWSET functions: Pratique pour extraire des données à partir de sources de données sur une base ponctuelle. OPENROWSET a des installations en vrac aussi bien qui peuvent/peuvent ne pas exiger un fichier de format qui pourrait être fiddley
  5. OPENQUERY : ne supporte pas les variables
  6. Tous sont T-SQL solutions. Relativement facile à mettre en œuvre et à configurer
  7. tous les dépendent de la connexion entre la source et la destionation qui pourrait affecter la performance et l'évolutivité
18
répondu super9 2014-04-01 21:57:58

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
14
répondu Anna Karthi 2013-12-14 06:43:06

ce sont toutes de bonnes réponses, mais celle-ci est manquante et il a ses propres utilisations puissantes. Peut-être que ça ne correspond pas à ce que l'OP voulait, mais la question était vague et je pense que d'autres pourraient trouver leur chemin ici. En gros, vous pouvez utiliser 1 fenêtre pour lancer une requête contre plusieurs serveurs, voici comment:

ouvre les serveurs enregistrés et crée un nouveau groupe de serveurs sous groupes de serveurs locaux .

Dans ce groupe, créez enregistrement du nouveau serveur pour chaque serveur que vous souhaitez consulter. Si les noms de bases de données sont différents, assurez-vous de définir une valeur par défaut pour chacune des propriétés.

retournez maintenant au groupe que vous avez créé à la première étape, cliquez avec le bouton droit de la souris et sélectionnez New Query. Une nouvelle fenêtre de requête s'ouvre et une requête sera exécutée sur chaque serveur du groupe. Les résultats sont présentés dans un ensemble de données unique avec une colonne supplémentaire indiquant le nom de serveur le record est venu d'. Si vous utilisez la barre d'état, vous notez le nom du serveur est remplacé par multiple .

11
répondu Paul 2017-03-03 09:13:04

Server 2008:

en SSMS connectés à server1.DB1 et essayer:

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

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

j'obtiens l'erreur:

N'a pas pu trouver le serveur DB2 dans sys.serveur. Vérifier que la bonne nom du serveur spécifié. Si nécessaire, exécuter la procédure stockée sp_addlinkedserver pour ajouter le serveur sys.serveur.

pour ajouter le serveur:

référence: pour ajouter un serveur en utilisant sp_addlinkedserver Lien: [1]: pour ajouter un serveur utilisant sp_addlinkedserver

pour voir ce qu'il y a dans votre sys.les serveurs l'interrogent simplement:

SELECT * FROM [sys].[servers]
3
répondu user3586922 2017-12-13 12:16:59

j'ai eu le même problème pour connecter un SQL_server 2008 à un SQL_server 2016 hébergé dans un serveur distant. D'autres réponses n'ont pas fonctionné pour moi. J'écris ici ma solution modifiée car je pense qu'elle peut être utile pour quelqu'un d'autre.

Une longue réponse à distance IP db connections:

Étape 1: connecter des serveurs

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 une invention nom. Nous l'utiliserons 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 SQLServer DB.

Étape 2: Lancez vos requêtes Par exemple:

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

...et c'est tout!

détails de syntaxe: sp_addlinkedserver et sp_addlinkedsrvlogin

3
répondu MarcM 2018-05-03 10:09:09

a créé une définition de serveur lié dans un serveur à l'autre (vous avez besoin de SA pour le faire), puis les référencer avec 4-part naming (voir BOL).

2
répondu RBarryYoung 2009-07-17 15:37:22
 select * 
 from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
2
répondu Masum 2016-05-16 11:44:57
sp_addlinkedserver('servername')

donc ça devrait aller comme ça -

select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
0
répondu ugio 2016-04-03 07:39:01

je sais que c'est une vieille question, mais j'utilise des synonymes. Supposément la requête est exécutée dans le serveur de base de données A, et cherche une table dans un serveur de base de données B qui n'existe pas sur le serveur A. Ajouter alors un synonyme sur une base de données qui appelle votre table à partir du serveur B. votre requête ne doit pas inclure de schémas, ou des noms de base de données différents, il suffit d'appeler le nom de la table par habituel et il fonctionnera.

il n'y a pas besoin de relier les serveurs comme synonymes par say sont en quelque sorte lier.

0
répondu Niklas Henricson 2017-03-24 23:13:56

Objets du Serveur---> serveur lié ---> nouveau serveur lié

Dans serveur lié, écrire le nom du serveur ou l'adresse IP d'un autre serveur et choisir SQL Server Dans Security select (être fait en utilisant ce contexte de sécurité ) Ecrire le login et le mot de passe pour un autre serveur

maintenant connecté puis utiliser

Select * from [server name or ip addresses ].databasename.dbo.tblname
0
répondu Sameh 2017-12-13 11:39:35