0

J'ai environ 21 bases de données sur ma machine SQL Server 2012, qui devraient idéalement avoir la même liste de tables mais elles ne le font pas.SQL Server: trouver la liste des tables uniques à travers les bases de données

Supposons:

  • base de données 1 comporte des tableaux A, B, C, D, E
  • base de données 2 présente les tableaux A, B, C, D, Z
  • base de données 3 comporte des tableaux A, B, C, Y, Z
  • base de données 4 comporte des tableaux a, B, X, Y, Z

La sortie de ma demande finale doit être une liste de tables comme a, B, C, D, E , X, Y, Z

Je comprends que cette information peut être obtenue en joignant sys.tables de chaque base de données, mais je ne suis pas sûr de savoir quelle jointure dois-je utiliser et comment.

Tout point de départ sera apprécié

+0

[Ce] (http://stackoverflow.com/questions/6568098/how-to-get-a-list-of-all-tables-in-two-different-databases?rq=1) est quelque chose de similaire que j'ai trouvé mais j'ai besoin de faire la même chose pour plusieurs bases de données –

Répondre

3

Juste pour ceux qui tombent sur cela à l'avenir.

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

Vous pouvez utiliser union:

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; 

En fait, la sous-requête est pas vraiment nécessaire, mais il est pratique si vous voulez faire quelque chose comme compter le nombre des fois que chaque tableau apparaît.

0

Si je comprends bien votre question,

Vous souhaitez lister toutes les tables pour toutes les bases de données

Il est simple script avery qui accomplira cette tâche

comme floowing:

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

et d'obtenir la liste des tables seulement:

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

espérons que cela aide

+0

Tableau unique 'Across' bases de données. –