web-dev-qa-db-ja.com

自分自身を指すリンクサーバーの作成

SQL Server 2014インスタンスにリンクサーバーを作成しようとしていますservername\instancename次の呼び出しを使用:

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

エラーが発生します:

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

これはSQL Server 2005で正常に動作し、 [〜#〜] msdn [〜#〜] に従って、

リンクサーバーは、SQL Serverの別のインスタンスである必要はありません。

したがって、これを許可していない最近のバージョンで何が変更されたかはわかりません。 UIを使用すると、同様のメッセージが生成されます。

ローカルSQL Serverをリンクサーバーとして作成することはできません。

リクエストするのは奇妙なことだと私は理解していますが、2005年に機能していた(かつては別のインスタンスに存在していた)レガシーコードをサポートすることです。ドキュメントには、それは機能するはずであると記載されていますが、機能しません。これを2014年に機能させる方法はありますか、または基になるコードを変更する必要がありますか?

14
mathewb

さまざまなパラメーターで機能させることができたことがわかりました。

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

コード内でリンクサーバーの参照を処理する代わりに、現在リンクサーバーがある場所での synonym の使用を含む1回限りのコードへの投資を検討することをお勧めします。

だから代わりに:

SELECT whatever FROM someserver.somedb.dbo.mytable;

同義語があります:

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

次に、コードは単純です:

SELECT whatever FROM dbo.mytablepointer;

次に、オブジェクトを別のサーバーに移動した場合は、類義語を削除して再作成するだけで、コードを変更する必要はありません。

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

このコマンドを実行-ローカルサーバーをリンクサーバーとして使用でき、コードの変更は不要

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