我有许多不同的应用程序数据库和[Log]
表。我有一个中央数据库,它有一个类似的日志表,但有一个额外的列,叫做TenantId
。还有一个具有TenantId
和DatabaseName
列的Tenant
表。这些DatabaseName
包含应用程序数据库的名称。
现在,我想循环所有应用程序数据库,并将日志条目复制到中心日志表中,其中TenantId
属于应用程序数据库名称。
是否可以在中央数据库中编写一个过程,而不是在应用程序数据库中创建多个过程?所有数据库都在同一个SQL Server实例上。
只是一些快速的动态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 '+@LogTable+' Select *,TenantId='''+Name+''' From ['+Name+'].[dbo].[TransactionLog] '
From master.dbo.sysdatabases
Where Name<>@CentralDB
) A
Select @SQL
--Exec(@SQL)
您可以通过以下查询获得所有数据库的列表:
SELECT name
FROM master.dbo.sysdatabases
然后,您可以使用游标获取每个数据库数据,并插入当前数据库中的一个表中。