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?
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.
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:
En savoir plus sur Serveurs liés .
Objets Serveur -> Serveurs liés -> Nouveau serveur lié
Indiquez le nom du serveur distant.
Sélectionnez le type de serveur distant (SQL Server ou autre).
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.
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
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 ...
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:
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
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 .
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
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]
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).
select *
from [ServerName(IP)].[DatabaseName].[dbo].[TableName]
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]
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.
sp_addlinkedserver('servername')
alors ça devrait aller comme ça -
select * from table1
unionall
select * from [server1].[database].[dbo].[table1]
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
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