2009-07-30 1 views
3

Ich bin nicht mit dem SQL Server-Datenwörterbuch vertraut, aber ich habe angenommen, dass das, was ich versuche, möglich ist.SQL Server-Datenwörterbuch abfragen, um alle Datenbanken mit Tabelle 'x' zu finden

Wir haben eine Reihe von replizierten Datenbanken, unter verschiedenen Namen sagen: Client1 Client2 Client3

Anstatt sich auf eine Namenskonvention zu verlassen, ich hatte gehofft, dass diese Datenbanken zu identifizieren, basierend darauf, ob sie einen Schlüssel enthalten Tabelle, nennen Sie es MyTable. So begann eine Abfrage zu denken wie die folgenden gebraucht wurde:

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

dies nicht funktioniert, wie ich kann nicht sehen, wie sys.tables beizutreten direkt an sys.databases oder indirekt, und auch sys.tables ist eine Ansicht, die auf der aktiven Datenbank basiert, und nicht auf einem vollständigen Satz von Tabellen für alle Datenbanken.

Kann jemand eine passende Abfrage für diese Situation identifizieren?

Antwort

5

Versuchen Sie, die ohne Papiere sp_MSforeachdb

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

Der einzige Weg, dass es in den Sinn kommt zu tun, wie eine Abfrage, um die Select-Anweisung zu bauen, ist dynamisch (einfügen Standard dynamische SQL-Warnung/Ablehnung hier)

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) 

* HINWEIS Ich habe einige Kriterien für den Status und die Sortierung der verfügbaren Datenbanken hinzugefügt.

+3

+1 Angepasst an die unten für meinen Zweck, da ich ein einzelnes Abfrageergebnis benötigt. Ich hoffe immer noch auf eine reine Abfrage Antwort, wenn jemand eine hat. CREATE TABLE #ClientDbs ( -Name varchar (max) ) master.sys.sp_MSforeachdb 'USE EXECUTE? INSERT INTO #ClientDbs SELECT table_catalog VON INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE '' Profil '' ' SELECT * FROM #ClientDbs DROP TABLE #ClientDbs – MattH