web-dev-qa-db-fra.com

Création d'un serveur lié qui pointe vers lui-même

J'essaie de créer un serveur lié sur une instance de SQL Server 2014 servername\instancename en utilisant l'appel suivant:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'

Je reçois l'erreur:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.

Cela fonctionne très bien dans SQL Server 2005, et selon MSDN ,

Le serveur lié ne doit pas être une autre instance de SQL Server,

Je ne suis donc pas sûr de ce qui a changé dans les versions récentes qui interdisent cela. L'utilisation de l'interface utilisateur génère un message similaire:

Vous ne pouvez pas créer un serveur SQL local en tant que serveur lié.

Je comprends que c'est une chose étrange à demander, mais c'est pour prendre en charge un code hérité qui a fonctionné en 2005 (et était sur des instances distinctes). La documentation indique que cela devrait fonctionner, mais ce n'est pas le cas. Existe-t-il un moyen de faire fonctionner cela en 2014, ou vais-je devoir modifier le code sous-jacent?

14
mathewb

Il s'avère que j'ai pu le faire fonctionner avec différents paramètres.

EXEC master.dbo.sp_addlinkedserver
    @server = N'LinkedServerName', 
    @srvproduct=N'', 
    @provider=N'SQLNCLI', 
    @provstr=N'DRIVER={SQL Server};Server=(local)\InstanceName; Initial Catalog=DBNAME;uid=user;pwd=password;'
20
mathewb

Au lieu de traiter des références de serveur lié dans votre code, vous voudrez peut-être envisager un investissement de code unique impliquant l'utilisation d'un synonyme dans n'importe quel emplacement où vous disposez actuellement d'un serveur lié.

Donc au lieu de:

SELECT whatever FROM someserver.somedb.dbo.mytable;

Vous avez un synonyme:

CREATE SYNONYM dbo.mytablepointer FOR someserver.somedb.dbo.mytable;

Ensuite, votre code est simplement:

SELECT whatever FROM dbo.mytablepointer;

Ensuite, si vous avez des objets déplacés vers différents serveurs, il vous suffit de supprimer et de recréer les synonymes et de ne pas avoir à toucher le code:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
12
Aaron Bertrand

Exécutez cette commande - vous pourrez utiliser le serveur local comme serveur lié sans changement de code nécessaire

EXEC sp_addlinkedserver @server = 'LinkedServerName',
                        @provider ='SQLNCLI',
                        @datasrc ='LocalServerName',
                        @srvproduct = 'SQL'
3
Ashish Nigam