2016-07-24 53 views
0

我有許多不同的應用程序數據庫,其中有[Log]表。我有一個具有類似日誌表的中央數據庫,但有一個額外的列名爲TenantId。還有一個Tenant表,TenantIdDatabaseName列。這些DatabaseName包含應用程序數據庫的名稱。SQL Server:從不同數據庫收集數據

現在我想要循環所有應用程序數據庫並將日誌條目複製到中央日誌表中,其中TenantId屬於應用程序數據庫名稱。

是否可以在中央數據庫中編寫一個過程,而不是在應用程序數據庫中創建許多過程?所有數據庫都在同一個SQL Server實例上。

+0

考慮使用鏈接的服務器。其餘的應該很容易。 –

+0

另一種方法是使用一些動態SQL。這是一次性事件還是您將安排合併? –

回答

1

只是一些快速的動態SQL。在下面的例子中,CHINRUS是我的中央數據庫,因此將被排除在合併之外。

我應該補充說,WHERE應該適合排除服務器上任何misc數據庫。還有一種選擇是維護一個具有正確定義的表格。

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

你可以用下面的查詢所有數據庫的列表:

SELECT name 
FROM master.dbo.sysdatabases 

,然後你可以使用光標獲得每個數據庫中的數據,並在一個表中當前數據庫中插入。