2009-07-30 9 views
3

Je ne suis pas trop familier avec le dictionnaire de données SQL Server, mais j'ai supposé que ce que j'essaie de faire est possible.Interroger le dictionnaire de données SQL Server pour trouver toutes les bases de données contenant la table 'x'

Nous avons un certain nombre de bases de données répliquées, sous différents noms disent: Client1 Client2 client3

Plutôt que de compter sur une convention de nommage, j'espérais identifier ces bases de données, selon qu'ils sont une clé table, appelez-le MyTable. Ainsi, commencé à penser une requête, comme suit était nécessaire:

SELECT db.name 
FROM sys.databases db 
JOIN sys.tables tbl ON ?? 
WHERE tbl.Name = 'MyTable' 

Cela ne fonctionne pas, car je ne vois pas comment joindre sys.tables à sys.databases directement ou indirectement, et aussi sys.tables est une vue basée sur la base de données active, plutôt qu'un ensemble complet de tables pour toutes les bases de données.

Quelqu'un peut-il identifier une requête appropriée pour cette situation?

Répondre

5

Essayez le sans papier sp_MSforeachdb

EXECUTE master.sys.sp_MSforeachdb 
'select table_catalog from 
information_schema.tables where table_name like ''MyTable%''' 

La seule façon qui vient à l'esprit pour le faire comme une requête est de construire l'instruction select dynamique (insérer avertissement/désapprobation standard SQL dynamique ici)

Declare @SQL varchar(max) 
    Set @SQL = '' 
    Select @SQL = @SQL + Coalesce('Select Distinct 
    table_catalog from ' + name + '.information_schema.tables 
    where table_name like ''mytable%'' UNION ','') 
    from sys.databases where state_desc = 'ONLINE' 
    and collation_name = 'SQL_Latin1_General_CP1_CI_AS' 
    set @SQL = Substring(@SQL, 1, Len(@SQL) - 6) + ' order by table_catalog ' 
    exec (@SQL) 

* NOTE J'ai ajouté quelques critères pour l'état et la collation des bases de données disponibles.

+3

+1 Adapté au ci-dessous pour mon but, car j'avais besoin d'un seul résultat de requête. Toujours en espérant une réponse de requête pure si quelqu'un en a un. CREATE TABLE #ClientDbs ( Nom varchar (max) ) EXECUTE USE 'master.sys.sp_MSforeachdb ? INSERT INTO #ClientDbs SELECT table_catalog DE INFORMATION_SCHEMA.TABLES OÙ nom_de_table LIKE '' Profil '' ' SELECT * FROM #ClientDbs DROP TABLE #ClientDbs – MattH

Questions connexes