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?
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;'
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;
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'