Comment afficher une liste contenant toutes les tables de toutes les bases de données d'un serveur SQL Server 2008 R2?
Vous avez besoin d'une requête pour chaque base de données par rapport à 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
Vous pouvez utiliser sys.databases
pour générer et exécuter la requête de manière dynamique.
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)
Je pense que cela vaut également la peine de noter la manière PowerShell/SMO de le faire. C'est l'une de ces exigences qui pourrait être assez indolore avec PowerShell, et certainement l'approche la plus simple si vous avez besoin de collecter ces données sur plusieurs serveurs:
$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 }}
}
Vous pouvez utiliser le sp_MSforeachdb
procédure pour ce faire
create table #tablist(db sysname, tab sysname);
exec sp_msforeachdb '
use [?];
insert into #tablist
select db_name(),name from sys.tables;'
select * from #tablist
drop table #tablist