現在、ストアド プロシージャでクエリを実行しているリンク サーバーがあります。現在、クエリは正常に機能していますが、このクエリはコードのブランチごとに変更する必要があります。クロス サーバー クエリで呼び出しているデータベース名を取得するための最適な方法を知りたいです。
例: サーバー A にはサーバー B へのリンクがあります。サーバー A には 3 つのデータベースが含まれています。SRV_A.DB1_DEV、SRV_A.DB2_Trunk、SRV_A.DB3_Prod それぞれが対応するサーバー B にリンクされています... SRV_B.DB1_DEV、SRV_B.DB2_Trunk、SRV_B.DB3_Prod
サーバー A の各データベースには、同じストアド プロシージャがあります。sproc で変更されるのは、クロスサーバーの選択だけです。したがって、SRV_A.DB1_Dev の sproc には次のような選択があります。
SELECT foo FROM [SRV_B].[DB1_DEV].[foo_table] WHERE bar = 1
一方、トランク ブランチのストアド プロシージャは次のようになります。
SELECT foo FROM [SRV_B].[DB2_Trunk].[foo_table] WHERE bar = 1
上記のすべてのブランチに DB をデプロイする VS プロジェクトが必要なので、データベース名を動的に入力できるようにしたいと考えています。私が思いついた解決策は、CHARINDEX 関数で一連の IF チェックを使用してから、次のように動的 SQL でクエリを作成することです。
DECLARE @dSql NVARCHAR(4000);
DECLARE @databaseName NVARCHAR(100) = DB_NAME();
DECLARE @tableName NVARCHAR(100);
IF SELECT CHARINDEX('Dev', @databaseName, 0)
SET @tableName = '[SRV_B].[DB1_DEV].[foo_table]
...Same if & set for Trunk
...Same if & set for Prod
SET @dSql = 'DECLARE @retID INT;SELECT foo FROM ' + @tableName
+ ' WHERE bar = 1';SET @retID = SELECT SCOPE_IDENTITY()'
EXEC(@dSQL);
より良い解決策があると想像する必要がありますが、誰かが私を助けることができれば、それは大歓迎です。外からのショットでこれが最善の方法である場合は、私にも知らせてください。
ありがとう、ジェームズ