3

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

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

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

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

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

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

4

1 回答 1

5

尝试未记录的 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)

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

于 2009-07-30T14:37:00.000 回答