2016-07-24 9 views
0

Ich habe viele verschiedene Anwendungsdatenbanken mit einer [Log] Tabelle. Ich habe eine zentrale Datenbank mit einer ähnlichen Protokolltabelle, aber mit einer zusätzlichen Spalte namens TenantId. Es gibt auch eine Tenant Tabelle mit einer TenantId und einer DatabaseName Spalte. Diese DatabaseName enthalten die Namen der Anwendungsdatenbanken.SQL Server: Daten aus verschiedenen Datenbanken sammeln

Jetzt möchte ich alle Anwendungsdatenbanken Schleife und kopieren Sie die Protokolleinträge in die zentrale Protokolltabelle, mit der TenantId, die zum Namen der Anwendungsdatenbank gehört.

Wäre es möglich, eine Prozedur in die zentrale Datenbank zu schreiben, anstatt viele Prozeduren in den Anwendungsdatenbanken zu erstellen? Alle Datenbanken befinden sich in derselben SQL Server-Instanz.

+0

Verwenden Sie verknüpfte Server. Der Rest sollte einfach sein. –

+0

Ein anderer Ansatz wäre etwas dynamisches SQL. Ist dies ein einmaliges Ereignis oder planen Sie die Konsolidierung? –

Antwort

1

Nur ein paar schnelle Dynamic SQL. Im folgenden Beispiel ist CHINRUS meine zentrale Datenbank und würde daher von der Konsolidierung ausgeschlossen.

Ich sollte hinzufügen, dass die WHERE sollte angepasst werden, um alle Misc-Datenbank auf dem Server auszuschließen. Eine weitere Option wäre, eine Tabelle mit den richtigen Definitionen zu führen.

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

Sie können mit folgenden Abfrage Liste aller Datenbanken erhalten:

SELECT name 
FROM master.dbo.sysdatabases 

und dann können Sie einen Cursor verwenden, um jede Datenbank Daten zu erhalten und in der aktuellen Datenbank in einer Tabelle einfügen.