web-dev-qa-db-fra.com

Réunir des tables de différents serveurs

Des suggestions sur la façon de joindre des tables de différents serveurs dans une procédure stockée?

9
el ninho

Sans plus de détails, il est difficile de donner des exemples directs, mais voici l’idée de base:

Tout d'abord, en dehors de la procédure stockée, le serveur hôte (le serveur sur lequel la procédure stockée sera activée) doit connaître le second serveur, y compris (éventuellement) les informations de connexion.

Sur votre serveur principal, exécutez la procédure stockée sp_addlinkedserver. Cela ne doit être fait qu'une seule fois:

exec sp_addlinkedserver @server=’(your second server)‘;

Si vous devez fournir les informations de connexion à ce deuxième serveur (par exemple, le processus ne peut pas se connecter avec les mêmes informations d'identification que celles utilisées lors de la connexion à la base de données initiale), utilisez le sp_addlinkedsrvlogin stocké:

exec sp_addlinkedsrvlogin @rmtsrvname=’(your second server)‘,@useself=false, @rmtuser=’yourusername‘, @rmtpassword=’yourpassword‘;

Ensuite, dans votre procédure stockée, vous pouvez spécifier des tables sur le deuxième serveur:

SELECT table1.*
FROM table1
INNER JOIN [secondserver].[database].[schema].[table] AS table2 ON
    table1.joinfield = table2.joinfield
12
scott.korin

Vous devez d'abord lier deux serveurs avant de rejoindre les tables. Une fois qu'ils sont liés, vous pouvez simplement utiliser la requête ci-dessous et remplacer les noms de serveur, de base de données et de table. 

N'oubliez pas d'exécuter les fichiers sql ci-dessous dans DB2:

EXEC sp_addlinkedserver DB1
GO

-- below statement connects sa account of DB2 to DB1
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'DB1', @useself = 'false', @locallogin = 'sa', @rmtuser = 'sa', @rmtpassword = 'DB1 sa pwd'
GO

SELECT a.columns 
FROM DB1.database_name.dbo.table_name a
INNER JOIN DB2.database_name.dbo.table_name b
ON a.columnId = b.columnId
GO

Liaison de serveurs - http://msdn.Microsoft.com/en-us/library/ms188279.aspx

2
avakharia

1. Vérifiez si vous avez des serveurs liés utilisant exec sp_helpserver

2. Si votre serveur n'est pas renvoyé, ce n'est pas Linked, ce qui signifie que vous devrez l'ajouter. Sinon, passez à l'étape 3.

Pour Sql Server 2008 R2 , accédez à Server Object > Linked Servers > Add new Linked Server

Ou

exec sp_addlinkedserver @server='ServerName'; 

3. Connectez-vous au serveur secondaire comme si ...

exec sp_addlinkedsrvlogin 
@rmtsrvname='ServerName'
, @useself=false
, @rmtuser='user'
, @rmtpassword='Password';

4. Vous pouvez maintenant joindre les tables des deux serveurs différents.

SELECT 
    SRV1.*
FROM 
    DB1.database_name.dbo.table_name SRV1
        INNER JOIN DB2.database_name.dbo.table_name SRV2
        ON SRV1.columnId = SRV2.columnId
GO
1
ѺȐeallү

Vous pouvez écrire la requête comme ci-dessous pour joindre un autre serveur dans SQL Server.

SELECT table_1.*  
FROM [Database_1].[dbo].[Table_1] table_1
INNER JOIN  [IP_OF_SERVER_2].[Database_2].[dbo].[Table_2] table_2 ON table_1.tablekey COLLATE DATABASE_DEFAULT  = table_2.tablekey COLLATE DATABASE_DEFAULT

p/s: COLLATE DATABASE_DEFAULT à coder, Empêcher l'erreur ci-dessous Impossible de résoudre le conflit de classements entre "Vietnamese_CI_AS" et "SQL_Latin1_General_CP1_CI_AS" dans le même sens que l'opération.

0
Thanh Phi