web-dev-qa-db-fra.com

Affichage de la liste de toutes les tables dans toutes les bases de données

Comment afficher une liste contenant toutes les tables de toutes les bases de données d'un serveur SQL Server 2008 R2?

6
Vinoth _S

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)
11
Mikael Eriksson

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 }}
}
8
Thomas Stringer

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
3
Satheesh Variath