2016-07-24 3 views
0

У меня много разных баз данных приложений с таблицей [Log]. У меня есть одна центральная база данных с аналогичной журнальной таблицей, но с одним дополнительным столбцом, который называется TenantId. Существует также таблица Tenant с колонкой TenantId и DatabaseName. Эти 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 

, а затем вы можете использовать курсор, чтобы получить каждый из данных базы данных и вставить в одну таблицу в текущей базе данных.

Смежные вопросы