0

Ich habe rund 21 Datenbanken auf meinem SQL Server 2012-Rechner, die idealerweise die gleiche Liste von Tabellen haben sollte, aber sie nicht tun.SQL Server: Suche Liste von eindeutigen Tabellen über Datenbanken

Angenommen:

  • Database 1 weist Tabellen A, B, C, D, E
  • Database 2 hat Tabellen A, B, C, D, Z
  • Database 3 hat Tabellen A, B, C, Y, Z
  • Datenbank 4 hat Tabellen A, B, X, Y, Z

Die Ausgabe von meiner letzten Abfrage muss eine Tabellenliste wie A, B, C, D, E sein , X, Y, Z

Ich verstehe, dass diese Informationen stammen können, indem Sie sys.tables jeder Datenbank beitreten, aber ich bin mir nicht sicher, über welchen Join sollte ich verwenden und wie.

select d.* 
from ((select table_name from db1.information_schema.tables) union 
     (select table_name from db2.information_schema.tables) union 
     . . . 
     (select table_name from db21.information_schema.tables) 
    ) d; 

Eigentlich ist die Unterabfrage ist nicht wirklich notwendig, aber es ist praktisch, wenn Sie etwas wie zählen die Anzahl tun wollen:

Jeder möglicher Ausgangspunkt

+0

[Dies] (http://stackoverflow.com/questions/6568098/how-to-get-a-list-of-all-tables-in-two-different-databases?rq=1) ist etwas ähnliches ich gefunden, aber ich muss das gleiche für mehrere Datenbanken tun –

Antwort

3

Nur für diejenigen, die in Zukunft darüber stolpern.

SET NOCOUNT ON 
DECLARE @AllTables TABLE 
     (
     ServerName NVARCHAR(200) 
     ,DBName NVARCHAR(200) 
     ,SchemaName NVARCHAR(200) 
     ,TableName NVARCHAR(200) 
     ) 
DECLARE @SearchSvr NVARCHAR(200) 
     ,@SearchDB NVARCHAR(200) 
     ,@SearchS NVARCHAR(200) 
     ,@SearchTbl NVARCHAR(200) 
     ,@SQL NVARCHAR(4000) 


SET @SearchSvr = NULL --Search for Servers, NULL for all Servers 
SET @SearchDB = NULL --Search for DB, NULL for all Databases 
SET @SearchS = NULL --Search for Schemas, NULL for all Schemas 
SET @SearchTbl = NULL --Search for Tables, NULL for all Tables 


SET @SQL = 'SELECT 
     @@SERVERNAME 
     ,''?'' 
     ,s.name 
     ,t.name 
     FROM [?].sys.tables t 
     JOIN sys.schemas s on t.schema_id=s.schema_id 
     WHERE @@SERVERNAME LIKE ''%' + ISNULL(@SearchSvr, '') + '%'' 
     AND ''?'' LIKE ''%' + ISNULL(@SearchDB, '') + '%'' 
     AND s.name LIKE ''%' + ISNULL(@SearchS, '') + '%'' 
     AND t.name LIKE ''%' + ISNULL(@SearchTbl, '') + '%'' 
     AND ''?'' NOT IN (''master'',''model'',''msdb'',''tempdb'',''SSISDB'') 

      ' 
-- Remove the '--' from the last statement in the WHERE clause to exclude system tables 


INSERT INTO @AllTables 
     (
     ServerName 
     ,DBName 
     ,SchemaName 
     ,TableName 
     ) 
     EXEC sp_MSforeachdb @SQL 
SET NOCOUNT OFF 
SELECT distinct tablename 
FROM @AllTables 
+0

https://stackoverflow.com/questions/2875768/how-do%20-i-list-all-tables-in-all-databases-in-sql-server-in-a-single-result-set – John

2

Sie union können erkannt werden, von Zeiten, dass jede Tabelle erscheint.

0

Wenn ich verstanden Ihre Frage richtig,

Sie wollen für alle Datenbanken alle Tabellen aufzulisten

Es ist avery einfaches Skript, das diese Aufgabe

als floowing erreichen wird:

sp_msforeachdb 'select "?" AS db, * from [?].sys.tables' 

und die Liste der Tabellen nur erhalten:

sp_msforeachdb 'select "?" AS db, name from [?].sys.tables' 

hoffe das hilft

+0

Einzigartige Tabelle 'Across' Datenbanken. –

Verwandte Themen