リンクサーバーを参照するストアドプロシージャを持っています。手順全体のいくつかの場所で、次のようなものが得られます。
INSERT INTO [TableName]
(...Columns...)
SELECT ...Columns...
FROM [ServerName\InstanceName].[Catalogue].[dbo].[TableName]
WHERE TableNameID = @TableNameID
この手順は、私の開発環境、テスト環境、およびライブ環境に存在します。
問題は、サーバー名が環境ごとに異なるため、プロシージャの各コピーが微妙に異なることです。これにより、スクリプト更新の展開の管理が面倒になります。
各環境が同じバージョンのプロシージャを実行できるように、プロシージャを移植可能にする方法はありますか?
そうでない場合、スクリプトの展開を間違い/エラーに陥らなくするために私ができることはありますか?
リンクサーバーの名前は、サーバーの名前である必要はありません。総称名を使用できます。
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'
各環境でリンクサーバーを同じ名前で設定しますが、実際にはそれらを異なるサーバーに向けます。
汎用のリンクサーバー名を使用するのが好きです。ただし、多くの環境ではこれが不可能な場合があります。この場合、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