Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择仅包含特定表的数据库_Sql_Sql Server_Sql Server 2008 R2 - Fatal编程技术网

Sql 选择仅包含特定表的数据库

Sql 选择仅包含特定表的数据库,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我正在寻找一种方法来选择sql server上的所有数据库,这些数据库只包含表“dbo.mytable” 我该怎么做 我已经有两个sql查询: Select name From sys.databases Where database_id > 5 及 第一个查询列出我的sql server上的所有数据库,第二个查询检查dbo.mytable是否存在。我想合并它们 谢谢您可以使用spmsforeachdb这是一个未记录的存储过程,可以在所有数据库上运行: EXEC sp_Msforeac

我正在寻找一种方法来选择sql server上的所有数据库,这些数据库只包含表“dbo.mytable”

我该怎么做

我已经有两个sql查询:

Select name From sys.databases Where database_id > 5

第一个查询列出我的sql server上的所有数据库,第二个查询检查dbo.mytable是否存在。我想合并它们


谢谢

您可以使用
spmsforeachdb
这是一个未记录的存储过程,可以在所有数据库上运行:

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

有关spmsforeachtable的详细信息:

返回包含指定表的数据库列表-

查询:

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

...
输出:

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

...

一种简洁的方法可以将它们全部放在一个结果集中

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

Msg 942,级别14,状态4,第1行数据库“…”无法打开,因为它处于脱机状态。这是一个很好的解决方案,但还需要添加以下内容:State_desc!='离线'@Devart-很好。也许最好只是看看那些明确在线的。您已通过此查询为我完成了gr8工作。可以使用“state”=0代替“state_desc”筛选