Select databases which only contain specific table

点点圈 提交于 2019-11-29 04:08:55

A concise way that brings them all back in one resultset is

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

You can use sp_Msforeachdb that is an undocumented Stored procedure and run on all databases :

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

more about sp_msforeachtable : The undocumented sp_MSforeachdb procedure

Devart

Return list of databases, which contains the specified table -

Query:

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

Output:

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

...
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!