SQL Server:查找跨数据库的唯一表列表

时间:2016-08-02 12:21:40

标签: sql-server database sql-server-2012 database-schema information-schema

我的SQL Server 2012计算机上有大约21个数据库,理想情况下应该有相同的表列表,但它们不会。

假设:

  • 数据库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来获取,但我不确定应该使用哪个联接以及如何使用。

任何起点都将受到赞赏

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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;

实际上,子查询并不是必需的,但是如果你想做一些事情,比如计算每个表出现的次数,它就很方便。

答案 2 :(得分:0)

如果我理解你的问题,

您想列出所有数据库的所有表

有一个非常简单的脚本可以完成这项任务

as floowing:

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

并获取表格列表:

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

希望这会有所帮助