【问题标题】:Query SQL Server data dictionary to find all databases containing table 'x'查询 SQL Server 数据字典以查找包含表 'x' 的所有数据库
【发布时间】:2009-07-30 14:17:50
【问题描述】:

我对 SQL Server 数据字典并不太熟悉,但我认为我正在尝试做的事情是可能的。

我们有许多复制的数据库,以不同的名称表示: 客户1 客户2 客户3

我希望根据它们是否包含关键表来识别这些数据库,而不是依赖命名约定,称之为 MyTable。因此开始考虑需要如下查询:

SELECT db.name
FROM sys.databases db
JOIN sys.tables tbl ON ??
WHERE tbl.Name = 'MyTable'

这不起作用,因为我看不到如何将 sys.tables 直接或间接连接到 sys.databases,而且 sys.tables 是基于活动数据库的视图,而不是一组完整的表适用于所有数据库。

谁能确定适合这种情况的查询?

【问题讨论】:

    标签: sql sql-server data-dictionary


    【解决方案1】:

    尝试未记录的 sp_MSforeachdb

    EXECUTE master.sys.sp_MSforeachdb 
    'select table_catalog from 
    information_schema.tables where table_name like ''MyTable%'''
    

    想到将其作为查询执行的唯一方法是动态构建 select 语句(在此处插入标准动态 sql 警告/拒绝)

     Declare @SQL varchar(max)
        Set @SQL = ''
        Select @SQL = @SQL + Coalesce('Select Distinct 
        table_catalog from ' + name  + '.information_schema.tables 
        where table_name like ''mytable%''  UNION ','' )
        from sys.databases where state_desc = 'ONLINE'
        and collation_name =  'SQL_Latin1_General_CP1_CI_AS'
        set @SQL =  Substring(@SQL, 1, Len(@SQL) - 6) + ' order by table_catalog  '
        exec (@SQL)
    

    *注意我为可用数据库的状态和排序添加了一些标准。

    【讨论】:

    • +1 为了我的目的而适应以下内容,因为我需要一个查询结果。如果有人有,仍然希望得到一个纯粹的查询答案。创建表#ClientDbs(名称varchar(max))执行master.sys.sp_MSforeachdb'使用? INSERT INTO #ClientDbs SELECT table_catalog FROM INFORMATION_SCHEMA.TABLES WHERE table_name LIKE ''Profile'' ' SELECT * FROM #ClientDbs DROP TABLE #ClientDbs
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-26
    • 1970-01-01
    • 2019-06-18
    • 2013-01-30
    • 1970-01-01
    相关资源
    最近更新 更多