2013-05-13 63 views
8

我正在尋找一種方式來選擇我的SQL服務器上所有的數據庫,其中僅包含表「dbo.mytable」選擇數據庫只包含特定的表

我怎麼能這樣做呢?

我已經有兩個SQL查詢:

Select name From sys.databases Where database_id > 5 

而且

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] 

的第一個查詢,列出我的SQL服務器上的所有數據庫和第二檢查是否存在dbo.mytable。我想合併它們。

感謝

回答

13

帶來他們都回到了一個結果一個簡潔的方法是

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

消息942,級別14,狀態4,第1行 數據庫'...'無法打開,因爲它處於脫機狀態。 – Devart 2013-05-13 11:36:27

+1

這是一個很好的解決方案,但也需要添加:state_desc!='OFFLINE' – Devart 2013-05-13 11:37:24

+1

@Devart - 好點。可能最好的方法是查看明確在線的人。 – 2013-05-13 11:45:20

4

您可以使用sp_Msforeachdb這是一個未公開的存儲過程,並在所有數據庫上運行:

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

更多sp_msforeachtable:The undocumented sp_MSforeachdb procedure

4

數據庫返回列表,其中包含指定表 -

查詢:

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 

輸出:

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

... 
相關問題