SQL 服务器:查找跨数据库的唯一表列表

SQL Server : finding list of unique tables across databases

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

假设:

我最终查询的输出必须是一个 table 列表,如 A、B、C、D、E、X、Y、Z

我知道可以通过连接每个数据库的 sys.tables 获取此信息,但我不确定应该使用哪个连接以及如何连接。

任何起点将不胜感激

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

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

如果我没有正确理解你的问题,

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

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

如下图:

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

并仅获取表格列表:

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

希望这对您有所帮助

仅供将来偶然发现此内容的人使用。

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