0

我的SQL Server 2012機器上有大約21個數據庫,理想情況下它們應該有相同的表列表,但它們沒有。SQL Server:查找數據庫中唯一表的列表

假設:

  • 數據庫1具有表A,B,C,d,E
  • 數據庫2具有表A,B,C,d,Z
  • 數據庫3具有表A, B,C,Y,Z
  • 數據庫4具有表A,B,X,Y,Z

我的最終查詢必須像A,B,C,d,E表列表的輸出,X,Y,Z

我知道這個信息可以通過加入每個數據庫的sys.tables來獲得,但我不確定我應該使用哪個連接以及如何連接。

任何出發點可以理解

+0

[這](http://stackoverflow.com/questions/6568098/how-to-get-a-list-of-all-tables-in-two-different-databases?rq=1)是我找到的類似的東西,但我需要爲多個數據庫做同樣的事情 –

回答

3

只爲那些未來偶然發現。

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

您可以使用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; 

其實,子查詢是不是真的有必要,但如果你想要做的事更是得心應手,如算上數每個表格出現的次數。

0

如果我理解正確你的問題,

要列出所有表的所有數據庫

有艾利簡單的腳本,這將完成這一任務

爲floowing:

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

並僅獲取表格列表:

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

希望這可以幫助

+0

獨特的表'跨越'數據庫。 –

相關問題