我的SQL Server 2012计算机上有大约21个数据库,理想情况下应该有相同的表列表,但它们不会。
假设:
我的最终查询的输出必须是表格列表,如A,B,C,D,E,X,Y,Z
我理解这些信息可以通过加入每个数据库的sys.tables
来获取,但我不确定应该使用哪个联接以及如何使用。
任何起点都将受到赞赏
答案 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'
希望这会有所帮助