2016-07-24 9 views
0

[Log]テーブルを持つ多くの異なるアプリケーションデータベースがあります。私は同じログテーブルを持つ1つの中央データベースを持っていますが、TenantIdという1つの余分な列があります。 TenantIdDatabaseNameの列を持つTenantテーブルもあります。これらのDatabaseNameには、アプリケーションデータベースの名前が含まれています。SQL Server:異なるデータベースからデータを収集

ここで、すべてのアプリケーションデータベースをループし、アプリケーションデータベース名に属するTenantIdを持つログエントリを中央ログテーブルにコピーします。

アプリケーションデータベースに多数のプロシージャを作成する代わりに、中央データベースに1つのプロシージャを記述することは可能でしょうか?すべてのデータベースが同じSQL Serverインスタンス上にあります。

SELECT name 
FROM master.dbo.sysdatabases 

をして、各データベースのデータを取得し、現在のデータベースにあるテーブルに挿入するためにカーソルを使用することができます。

+0

リンクサーバーの使用を検討してください。残りは楽になるはずです。 –

+0

もう1つのアプローチは、いくつかの動的SQLです。これは1回限りのイベントですか、または連結をスケジュールしますか? –

答えて

1

簡単なダイナミックSQL。以下の例では、CHINRUSは私の中央データベースであり、したがって連結から除外されます。

サーバー上のその他のデータベースを除外するには、WHEREを調整する必要があります。さらに別の選択肢は、適切な定義を持つテーブルを維持することです。

Declare @LogTable varchar(100)='[Chinrus].[dbo].[TransactionLog]' 
Declare @CentralDB varchar(100)='Chinrus' 

Declare @SQL varchar(max) = '' 

Select @SQL = @SQL + SQL 
From (
     Select Name,SQL=';Insert Into '[email protected]+' Select *,TenantId='''+Name+''' From ['+Name+'].[dbo].[TransactionLog] ' 
     From master.dbo.sysdatabases 
     Where Name<>@CentralDB 
    ) A 

Select @SQL 
--Exec(@SQL) 
1

次の問合せを持つすべてのデータベースのリストを取得することができます。

関連する問題