2013-05-13 13 views
8

szukam sposób, aby zaznaczyć wszystkie bazy danych na moim serwerze SQL, które zawierają tylko tabelę „dbo.mytable”Wybierz bazy danych, które zawierają tylko konkretną tabelę

W jaki sposób można to zrobić?

mam już tych dwóch sql zapytania:

Select name From sys.databases Where database_id > 5 

I

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] 

pierwszego zapytania, wymienia wszystkich baz danych na moim serwerze sql, a drugi sprawdza, czy dbo.mytable istnieje. Chciałbym je połączyć.

Dzięki

Odpowiedz

13

zwięzły sposób, który przynosi je wszystkie z powrotem w jednym wynikowego jest

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, Level 14, State 4, wiersz 1 Database "..." nie można otworzyć, ponieważ jest offline. – Devart

+1

To dobre rozwiązanie, ale trzeba też dodać: state_desc! = 'OFFLINE' – Devart

+1

@Devart - Dobra rada. Prawdopodobnie najlepiej po prostu spojrzeć na te, które są jawnie online. –

4

Można użyć sp_Msforeachdb że jest nieudokumentowana procedura składowana i uruchomić na wszystkich baz danych:

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

więcej o sp_msforeachtable: The undocumented sp_MSforeachdb procedure

4

listy Return baz danych, która zawiera określony tabela -

Zapytanie:

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 

wyjściowa:

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

... 
Powiązane problemy