显示所有数据库中所有表的列表

Vin*_* _S 6 sql-server sql-server-2008-r2

如何显示包含 SQL Server 2008 R2 服务器中所有数据库的所有表的列表?

Mik*_*son 11

您需要针对每个数据库查询sys.tables.

select 'master' as DatabaseName, 
       T.name collate database_default as TableName 
from master.sys.tables as T 
union all 
select 'tempdb' as DatabaseName, 
       T.name collate database_default as TableName 
from tempdb.sys.tables as T 
union all 
select 'model' as DatabaseName, 
       T.name collate database_default as TableName 
from model.sys.tables as T 
union all 
select 'msdb' as DatabaseName, 
       T.name collate database_default as TableName 
from msdb.sys.tables as T 
Run Code Online (Sandbox Code Playgroud)

您可以使用sys.databases动态构建和执行查询。

declare @SQL nvarchar(max)

set @SQL = (select 'union all 
select '''+D.name+''' as DatabaseName,
       T.name collate database_default as TableName
from '+quotename(D.name)+'.sys.tables as T
'
from sys.databases as D
for xml path(''), type).value('substring((./text())[1], 13)', 'nvarchar(max)')

--print @SQL
exec (@SQL)
Run Code Online (Sandbox Code Playgroud)


Tho*_*ger 8

我认为 PowerShell/SMO 方法也值得一提。这是使用 PowerShell 可能非常轻松的要求之一,如果您需要跨多个服务器收集这些数据,这绝对是最简单的方法:

$SqlServerName = "YourInstanceName"

$SqlServer = New-Object Microsoft.SqlServer.Management.Smo.Server($SqlServerName)

foreach ($Database in (
    $SqlServer.Databases | 
        Where-Object {$_.Status -eq [Microsoft.SqlServer.Management.Smo.DatabaseStatus]::Normal })) {

    $Database.Tables | 
        Select-Object @{Name = "DatabaseName"; Expression = { $Database.Name }},
            @{Name = "SchemaName"; Expression = { $_.Schema }},
            @{Name = "TableName"; Expression = { $_.Name }}
}
Run Code Online (Sandbox Code Playgroud)