2013-05-13 14 views
8

Sto cercando un modo per selezionare tutti i database sul mio server sql, che contengono solo la tabella "dbo.mytable"Selezionare i database che contengono solo tabella specifica

Come posso fare questo?

ho già questi due query SQL:

Select name From sys.databases Where database_id > 5 

E

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] 

La prima query, elenca tutti i database sul mio server SQL, e il secondo controlla se esiste dbo.mytable. Mi piacerebbe unirli

Grazie

risposta

13

Un modo conciso che li riporta in un unico gruppo di risultati è

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, livello 14, stato 4, linea 1 Database '...' non può essere aperto perché è offline. – Devart

+1

È una buona soluzione, ma è anche necessario aggiungere questo: state_desc! = 'OFFLINE' – Devart

+1

@Devart - Buon punto. Probabilmente è meglio guardare solo quelli che sono esplicitamente online. –

4

è possibile utilizzare sp_Msforeachdb che è una stored procedure non documentata ed eseguire su tutti i database:

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

su sp_msforeachtable: The undocumented sp_MSforeachdb procedure

4

lista ritorno dei database, che contiene la specifica tavolo -

Richiesta informazioni:

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 

uscita:

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' 
) 

... 
Problemi correlati