SQL SERVER LIE - Erreur pour des champs nommés avec des points
Objectif : Etre capable de récupérer depuis une procédure stockée, les données nécessaires issues de plusieurs serveurs SQL, pour ensuite les injecter dans notre propre base.
Configuration : 3 serveurs SQL SERVER ( 2 de 2008 & 1 avec une version 2005) avec Windows Server 2008 & 2008 R2
Mise en place :
- Etape 1 : Création de la liaison
Vous avez 2 possibilités pour créer cette liaison : S’aider de l’interface SQL SERVER MANAGEMENT STUDIO ou créer un script TSQL. J’ai choisi la deuxième option.
J’ai d’abord liés mes serveurs :
USE [master]
GO
EXEC master.dbo.sp_addlinkedserver
@server = N'SRV01\Instance01',
@srvproduct=N'SQL Server' ;
GO
EXEC master.dbo.sp_addlinkedserver
@server = N'SRV02\Instance01',
@srvproduct = N'SQL Server';
GO
GOVous devriez avoir un message vous signalant que cette étape à réussie.
- Etape 2 : Configurer les informations de connexion
useself = False signale que l’identifiant transmis en paramètre est utilisé pour se connecter.
EXEC master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'SRV01\Instance01',
@locallogin = NULL ,
@useself = N'False',
@rmtuser = 'monuser',
@rmtpassword = 'monpassword';
GO
Exec master.dbo.sp_addlinkedsrvlogin
@rmtsrvname = N'SRV02\Instance01',
@locallogin = NULL ,
@useself = N'False',
@rmtuser = 'monuser',
@rmtpassword = 'monpassword';
GOUne fois ces deux opérations finies, vous devez être en mesure de communiquer avec ces 2 serveurs.
Vérifions :
SELECT name FROM [SRV01\Instance01].master.sys.databases
UNION ALL
SELECT name FROM [SRV02\Instance01].master.sys.databases
GOSi vous avez un résultat en retour, savourez votre moment :)
- Etape 3 : Création ou modification de la requête pour joindre les serveurs
Donc je continue et je modifie ma procédure stockée pour qu’elle puisse récupérer les informations dont j’ai besoin.
SELECT id,[User.name], [User.fisrtname], [Date], Sex, Country
FROM [SRV01\Instance01].DBClient AS linkedServer01
INNER JOIN [SRVR02\Instance01].User AS linkedServer02
ON linkedServer01.id = linkedServer02.id ;
GOLorsque j’ai tenté d’éxecuter cette requête, MS me signaler comme erreur que les champs
[User.name], [User.firstname]n’existent pas.
Je tiens à signaler que si les bases sont installées sur le même serveur SQL, vous ne rencontrerez jamais le moindre soucis.
Après recherche, je constate que Microsoft a publié un correctif. Après installation & redémarrage du serveur, cette mise à jour n’a pas solutionnée mon problème.
La solution à mon problème fut l’utilisation d’ OPENQUERY. Cet opérateur exécute la requête sur le serveur distant.
J’ai donc modifié la requête en conséquence :
SELECT id, [User.name], [User.firstname], [Date], Sex, Country
FROM OPENQUERY('SRV01\Instance01',SELECT id, [User.Name], [User.firstName] FROM DBClient ) AS linkedServer01
INNER JOIN OPENQUERY('SRVR02\Instance01', SELECT id, [Date Naissance], Sex, Country) AS linkedServer02
ON linkedServer01.id = linkedServer02.id ;
GOJ’exécute … et j’obtiens bien un résultat :)
Si un spécialiste passe par ici, qu’il m’informe pourquoi j’ai eu cette erreur. Est-ce un oublie lors de la création de la liaison, d’un soucis avec les pilotes OLEDB, d’une mise à jour non effectuée sur un des autres serveurs… ??? Et pourquoi l’opérateur OPENQUERY fonctionne…
Plus d’informations ici :
http://msdn.microsoft.com/fr-fr/library/ff772782.aspx http://msdn.microsoft.com/fr-fr/library/ms189811.aspx