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

GO

Vous 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';
GO

Une 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

GO

Si 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 ;
GO

Lorsque 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 ;
GO

J’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

Leave a Reply

Your email address will not be published. Required fields are marked *

 

This site uses Akismet to reduce spam. Learn how your comment data is processed.