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)
我认为 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)