查询SQL Server数据字典以查找包含表'x'的所有数据库

Mat*_*ttH 3 sql sql-server data-dictionary

我不太熟悉SQL Server数据字典,但我已经假设我正在尝试做的事情是可能的.

我们有许多复制的数据库,名称不同:Client1 Client2 Client3

我不是依赖于命名约定,而是希望根据它们是否包含密钥表来识别这些数据库,将其称为MyTable.所以开始考虑需要以下查询:

SELECT db.name
FROM sys.databases db
JOIN sys.tables tbl ON ??
WHERE tbl.Name = 'MyTable'
Run Code Online (Sandbox Code Playgroud)

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

任何人都可以为这种情况确定合适的查询吗?

cms*_*sjr 5

尝试未记录的sp_MSforeachdb

EXECUTE master.sys.sp_MSforeachdb 
'select table_catalog from 
information_schema.tables where table_name like ''MyTable%'''
Run Code Online (Sandbox Code Playgroud)

作为查询执行此操作的唯一方法是动态构建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)
Run Code Online (Sandbox Code Playgroud)

*注意我添加了一些可用数据库的状态和整理标准.

  • +1为了我的目的适应以下,因为我需要一个查询结果.如果有人有一个纯粹的查询答案仍然希望.CREATE TABLE #ClientDbs(Name varchar(max))EXECUTE master.sys.sp_MSforeachdb'USE?INSERT INTO #ClientDbs SELECT table_catalog FROM INFORMATION_SCHEMA.TABLES WHERE table_name LIKE''Profile'''SELECT*FROM #ClientDbs DROP TABLE #ClientDbs (3认同)