Des suggestions sur la façon de joindre des tables de différents serveurs dans une procédure stockée?
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
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
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
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.