3

同じストアド プロシージャ ロジックを共有する必要がある 2 つの異なる SQL Server データベース (同じサーバー上 - 役立つ場合) があります。私が達成しようとしている解決策は次のようになります。

Database1
  Table: TestTable
  Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc

Database2
  Table: TestTable
  Synonym: sp_MyProc pointing at SharedDatabase.dbo.sp_MyProc

SharedDatabase
  Proc: sp_MyProc which runs queries against TestTable

シノニムを使用して、Database1 のコンテキストで sp_MyProc を実行すると、Database2.TestTable が使用されるようにしたいと考えていました。また、Database2 のコンテキストで sp_MyProc を実行すると、Database2.TestTable に反します。ただし、シノニムのいずれかを使用して sp_MyProc を実行すると、シノニムのコンテキストが無視され、見つからない TestTable のローカル コピーを探して実行されます。

シノニムまたはその他のメカニズムを使用して、異なるデータベース内のテーブルの異なるコピーに対して実行する共有ストアド プロシージャを実装する方法はありますか?

編集
私の場合、既存のテーブルとプロシージャの大規模なセットでこれを実行しようとしているため、プロシージャまたはテーブル自体を変更する必要があるソリューションは理想的ではありません。

4

2 に答える 2

3

このようなものは、プロシージャの定義に使用できます。これは動的に構築されるため、SQL インジェクションに注意してください。

CREATE PROCEDURE [dbo].dosomething 
  @databaseName sysname,
  @schema sysname,
  @tableName sysname
  as
  declare @cmd as nvarchar(max)
  set @cmd = N'select * from ' + quotename(@schema) + N'.' + quotename(@tableName)
  exec sp_executesql @cmd

次に、次のように使用します。

  dosomething 'SampleDb', 'dbo', 'sampleTable'
于 2012-07-23T18:08:06.310 に答える
1

ストアド プロシージャが SharedDatabase にある場合は、常に SharedDatabase のコンテキストで実行されます。コードを一元化するためにやろうとしていることを達成するには、パラメーターを渡して、それがどのサーバーから来ているかを指定するので、その特定の TestTable に対してクエリを実行できます。基本的に、完全修飾名 (つまり、Database1.dbo.TestTable) を使用して各テーブルを参照する必要があります。



  USE SharedDatabase

  CREATE PROCEDURE [dbo].sp_MyProc 
  @dbsource varchar(50)
  as 

  if(@dbsource == 'DB1')
  begin

    select * from Database1.dbo.TestTable

  end
  else
  begin

    select * from Database2.dbo.TestTable

  end


  GO 




もう 1 つの方法は、SharedDatabase にビューを作成することです。これは TestTableComposite と呼ばれ、ソース データがどこにあるかを識別するための追加の列があります。次に、それをパラメーターとして渡すと、SharedDatabase 上の SP は常にその DB のコンテキストになります。

于 2012-07-23T18:17:22.153 に答える