SQL 服务器:查找跨数据库的唯一表列表
SQL Server : finding list of unique tables across databases
我的 SQL Server 2012 机器上有大约 21 个数据库,理想情况下应该有相同的 table 列表,但它们没有。
假设:
- 数据库 1 有 tables A、B、C、D、E
- 数据库 2 有 table 个 A、B、C、D、Z
- 数据库 3 有 tables A、B、C、Y、Z
- 数据库 4 有 tables A,B,X,Y,Z
我最终查询的输出必须是一个 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
我的 SQL Server 2012 机器上有大约 21 个数据库,理想情况下应该有相同的 table 列表,但它们没有。
假设:
- 数据库 1 有 tables A、B、C、D、E
- 数据库 2 有 table 个 A、B、C、D、Z
- 数据库 3 有 tables A、B、C、Y、Z
- 数据库 4 有 tables A,B,X,Y,Z
我最终查询的输出必须是一个 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