リンクサーバーを参照するポータブルSQLを作成するにはどうすればよいですか?


9

リンクサーバーを参照するストアドプロシージャを持っています。手順全体のいくつかの場所で、次のようなものが得られます。

INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID

この手順は、私の開発環境、テスト環境、およびライブ環境に存在します。

問題は、サーバー名が環境ごとに異なるため、プロシージャの各コピーが微妙に異なることです。これにより、スクリプト更新の展開の管理が面倒になります。

各環境で同じバージョンのプロシージャを実行できるように、プロシージャを移植可能にする方法はありますか?

そうでない場合、スクリプトの展開を間違い/エラーに陥らなくするために私ができることはありますか?


3
各サーバーで異なるビューを作成することはオプションですか?次のようにビューを定義できますが、SELECT <fields> FROM <linked server>すべてのサーバーで同じビュー名を使用して、コードを維持します
JNK

@JNKは悪い考えではありませんが、かなりの数のテーブルがありますが、少なくともビューは、リンクされたサーバー参照が全体にわたってペパードされたストアドプロシージャよりも保守が簡単です。
ドクタージョーンズ

@jnk、あなたはそれを答えにするべきです。
HLGEM、

回答:


14

リンクサーバーの名前は、サーバーの名前である必要はありません。総称名を使用できます。

EXEC master.dbo.sp_addlinkedserver
    @server = N'COMMONNAME',
    @srvproduct=N'MSDASQL',
    @provider=N'SQLNCLI',
    @provstr=N'DRIVER={SQL Server};SERVER=ACTUALSERVERNAME;UID=user1;PWD=rosebud567;', 
    @catalog=N'database1'

各環境でリンクサーバーを同じ名前で設定しますが、実際にはそれらを異なるサーバーに向けます。


0

汎用のリンクサーバー名を使用するアイデアが気に入っています。ただし、多くの環境ではこれが不可能な場合があります。この場合、spで動的SQlを使用できます。

declare @linkedservername nvarchar(200)
declare @sql nvarchar(4000)
SET @linkedservername =  CASE @@ServerName  
                            WHEN 'DevServer' THEN 'LinkedServerForDevEnvironment'
                            WHEN 'TestServer' THEN 'LinkedServerForTestEnvironment'
                            WHEN 'ProdServer' THEN 'LinkedServerForProdEnvironment'
                            ELSE Null
                        END   

set @sql = 'INSERT INTO [TableName] 
(...Columns...) 
SELECT ...Columns... 
FROM ' + @linkedservername + '.[Catalogue].[dbo].[TableName] 
WHERE TableNameID = @TableNameID'

Exec  @sql

1
これを実際に行っている場合、tryキャッチブロックを使用し、setステートメントの後に@linkedservernameがnullの場合にエラーが発生し、これが間違ったサーバーで実行されたことを警告することに注意してください。
HLGEM 2012年

1
このアプローチを採用した場合、CASEステートメントを関数でラップすると思います。サーバーが変更された場合は、関数を更新するだけで済みます。
Eli

良い点@Eli
HLGEM
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.