创建指向自身的链接服务器

mat*_*ewb 14 sql-server linked-server sql-server-2014

我正在尝试servername\instancename使用以下调用在 SQL Server 2014 实例上创建链接服务器:

EXEC master.dbo.sp_addlinkedserver 
    @server = N'servername\instancename',
    @srvproduct=N'SQL Server'
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Msg 15028, Level 16, State 1, Procedure sp_addlinkedserver, Line 82
The server 'servername\instancename' already exists.
Run Code Online (Sandbox Code Playgroud)

这在 SQL Server 2005 中运行良好,并且根据MSDN

链接服务器不必是 SQL Server 的另一个实例,

所以我不确定最近版本中不允许这样做的更改。使用 UI 会生成类似的消息:

不能将本地 SQL Server 创建为链接服务器。

我知道请求是一件奇怪的事情,但它是为了支持一些在 2005 年工作的遗留代码(并且曾经在不同的实例上)。文档指出它应该可以工作,但事实并非如此。有没有办法让它在 2014 年工作,或者我将不得不修改底层代码?

mat*_*ewb 20

事实证明,我能够让它使用不同的参数。

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;'
Run Code Online (Sandbox Code Playgroud)


Aar*_*and 14

与其在代码中处理链接服务器引用,不如考虑一次性代码投资,包括在当前拥有链接服务器的任何位置使用同义词

所以而不是:

SELECT whatever FROM someserver.somedb.dbo.mytable;
Run Code Online (Sandbox Code Playgroud)

你有一个同义词:

CREATE SYNONYM dbo.mytablepointer FOR someserver.somedb.dbo.mytable;
Run Code Online (Sandbox Code Playgroud)

那么你的代码很简单:

SELECT whatever FROM dbo.mytablepointer;
Run Code Online (Sandbox Code Playgroud)

然后,如果您将对象移动到不同的服务器,您只需删除并重新创建同义词,而不必接触代码:

DROP SYNONYM dbo.mytablepointer;
CREATE SYNONYM dbo.mytablepointer FOR otherserver.somedb.dbo.mytable;
Run Code Online (Sandbox Code Playgroud)