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?
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?
Réponses:
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 .
Il vous suffit d'en configurer 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
, alors assurez-vous de le remplacer par le schéma que vous utilisez.
[OtherServerName].[OtherDB]..[OtherTable]
il est préférable de l'inclure s'il est connu.
Vous pouvez le faire en utilisant Linked Server.
Les serveurs généralement 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 qu'Oracle. De nombreux types de sources de données OLE DB 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 les 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é -> Soyez fait en utilisant ce contexte de sécurité et fournissez le login et mot de passe du serveur distant.
Cliquez sur OK et vous avez terminé !!
Voici un didacticiel simple pour créer un serveur lié.
OU
Vous pouvez ajouter un serveur lié à l'aide d'une 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 ne devez créer un serveur lié qu'une seule fois . Après avoir créé un serveur lié, nous pouvons l'interroger comme suit:
select * from LinkedServerName.DatabaseName.OwnerName.TableName
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, telles que les plates-formes DB2. C'est une méthode pour essayer d'accéder à DB2 à partir d'un appel SQL Server TSQL ou Sproc ...
Could not find server '88.208.229.164' in sys.servers. Verify that the correct server name was specified. If necessary, execute the stored procedure sp_addlinkedserver to add the server to sys.servers.
L'interrogation sur 2 bases de données différentes est une requête distribuée. Voici une liste de quelques techniques ainsi que les avantages et les 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 voulait le PO, mais la question était vague et je pense 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 Serveurs enregistrés et créez un nouveau groupe de serveurs sous Groupes de serveurs locaux .
Sous ce groupe, créez un nouvel enregistrement de serveur pour chaque serveur que vous souhaitez interroger. Si les noms de base de données sont différents, assurez-vous de 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, faites un clic droit 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 de quel serveur provient l'enregistrement. Si vous utilisez la barre d'état, vous remarquerez que le nom du serveur est remplacé par plusieurs .
J'ai eu le même problème pour connecter un SQL_server 2008 à un SQL_server 2016 hébergé sur un serveur distant. D'autres réponses n'ont pas fonctionné directement pour moi. J'écris ma solution modifiée ici car je pense qu'elle peut être utile pour quelqu'un d'autre.
Une réponse étendue pour les connexions distantes IP db:
Étape 1: lier les 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 un nom inventé. 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 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
Création d'une définition de serveur lié dans un serveur à l'autre (vous avez besoin de SA pour ce faire), puis référencez-les simplement avec un nom en 4 parties (voir BOL).
Server 2008:
Lorsque dans SSMS connecté à server1.DB1 et essayez:
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é.
Je reçois l'erreur:
Impossible de trouver le serveur DB2 dans sys.servers. Vérifiez que le nom de serveur correct 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:
référence: pour ajouter un serveur à l'aide de sp_addlinkedserver Lien: [1]: pour ajouter un serveur à l'aide de sp_addlinkedserver
Pour voir ce qu'il y a dans vos serveurs sys., interrogez-le:
SELECT * FROM [sys].[servers]
Comme @ Super9 l'a expliqué sur OPENDATASOURCE à l'aide de l'authentification SQL Server avec le fournisseur de données SQLOLEDB . Je viens de publier ici un extrait de code pour une table se trouve dans la base de données de serveur actuelle où le code est en cours d'exécution et un autre sur 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
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 depuis le serveur B. Votre requête n'a pas à inclure des schémas ou des noms de base de données différents, il suffit d'appeler le nom de la table par habitude et cela fonctionnera.
Il n'est pas nécessaire de lier les serveurs car les synonymes sont, en quelque sorte, des liens.
Objets serveur ---> serveur lié ---> nouveau serveur lié
Dans le serveur lié, écrivez le nom du serveur ou l'adresse IP pour un autre serveur et choisissez SQL Server In Security sélectionnez (être fait en utilisant ce contexte de sécurité) Écrivez le login et le mot de passe pour l'autre serveur
Maintenant connecté puis utilisez
Select * from [server name or ip addresses ].databasename.dbo.tblname
Solution simplifiée pour ajouter des 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 liées à la base de données locale
INSERT INTO Tbl (Col1, Col2, Col3)
SELECT Col1, Col2, Col3
FROM [ip,port\instancename].[linkedDBName].[linkedTblSchema].[linkedTblName]