9

我正在寻找一种方法来选择我的 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 server 上的所有数据库,第二个查询是否存在 dbo.mytable。我想合并它们。

谢谢

4

3 回答 3

14

将它们全部返回到一个结果集中的一种简洁方法是

SELECT name
FROM   sys.databases
WHERE  CASE
         WHEN state_desc = 'ONLINE' 
              THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[mytable]', 'U')
       END IS NOT NULL 
于 2013-05-13T11:24:50.243 回答
4

您可以使用sp_Msforeachdb未记录的存储过程并在所有数据库上运行:

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

有关 sp_msforeachtable 的更多信息:未记录的 sp_MSforeachdb 过程

于 2013-05-13T10:24:54.107 回答
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'
)

...
于 2013-05-13T10:33:15.033 回答