2016-07-24 26 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 

,然后你可以使用光标获得每个数据库中的数据,并在一个表中当前数据库中插入。