web-dev-qa-db-ja.com

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

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

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

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

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

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

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

9
Doctor Jones

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

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'

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

14
Eli

汎用のリンクサーバー名を使用するのが好きです。ただし、多くの環境ではこれが不可能な場合があります。この場合、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
0
HLGEM