2013-05-13 13 views
8

ich nach einer Möglichkeit, alle Datenbanken auf meinem SQL-Server auswählen, die nur die Tabelle „dbo.mytable“ enthältWählen Sie Datenbanken, die nur bestimmte Tabelle enthält

Wie kann ich das tun?

Ich habe bereits diese beiden SQL-Abfragen:

Select name From sys.databases Where database_id > 5 

Und

IF EXISTS 
    (SELECT * FROM sys.objects 
    WHERE object_id = OBJECT_ID(N'[dbo].[mytable]') AND type in (N'U')) 
    Select 1 [Exists] 
Else 
    Select 0 [Exists] 

Die erste Abfrage, listet alle Datenbanken auf meinem SQL Server und die zweite überprüft, ob dbo.mytable vorhanden ist. Ich möchte sie zusammenführen.

Dank

Antwort

13

Eine prägnante Art und Weise, dass sie alle wieder in einem resultset bringt, ist

SELECT name 
FROM sys.databases 
WHERE CASE 
     WHEN state_desc = 'ONLINE' 
       THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[mytable]', 'U') 
     END IS NOT NULL 
+0

Msg 942, Ebene 14, Status 4, Zeile 1 Datenbank '...' kann nicht geöffnet werden, da es offline ist. – Devart

+1

Es ist eine gute Lösung, aber müssen auch hinzufügen: state_desc! = 'OFFLINE' – Devart

+1

@Devart - Guter Punkt. Am besten ist es, nur diejenigen anzusehen, die explizit online sind. –

4

Sie sp_Msforeachdb verwenden können, die eine nicht dokumentierte gespeicherte Prozedur wird und auf allen Datenbanken laufen:

EXEC sp_Msforeachdb "use [?];select * from sys.tables where name='MYTable' " 

mehr über sp_msforeachtable: The undocumented sp_MSforeachdb procedure

4

Zurück Liste der Datenbanken, die die angegebene enthält Tabelle -

Abfrage:

DECLARE 
     @SQL NVARCHAR(MAX) 
    , @table_name SYSNAME 

SELECT @table_name = 'dbo.test' 

IF OBJECT_ID('tempdb.dbo.#db_temp') IS NOT NULL 
    DROP TABLE #db_temp 

CREATE TABLE #db_temp (db_nm SYSNAME) 

SELECT @SQL = (
    SELECT ' 
     USE [' + d.name + ']; 

     INSERT INTO #db_temp (db_nm) 
     SELECT DB_NAME() 
     WHERE EXISTS(
      SELECT 1 
      FROM sys.objects 
      WHERE [object_id] = OBJECT_ID(''' + @table_name + ''') 
       AND [type] = ''U'' 
     )' 
    FROM sys.databases d 
    WHERE d.name NOT IN ('master', 'tempdb', 'model', 'msdb') 
     AND d.state_desc != 'OFFLINE' 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') 

EXEC sys.sp_executesql @SQL 

SELECT * 
FROM #db_temp dt 

Ausgang:

USE [...]; 

INSERT INTO #db_temp (db_nm) 
SELECT DB_NAME() 
WHERE EXISTS(
    SELECT 1 
    FROM sys.objects 
    WHERE [object_id] = OBJECT_ID('...') 
     AND [type] = 'U' 
) 

... 
Verwandte Themen