Запросить словарь данных SQL Server, чтобы найти все базы данных, содержащие таблицу 'x' - PullRequest
3 голосов
/ 30 июля 2009

Я не слишком знаком со словарем данных 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.database напрямую или косвенно, а также sys.tables - это представление, основанное на активной базе данных, а не полный набор таблиц для всех баз данных.

Может кто-нибудь определить подходящий запрос для этой ситуации?

1 Ответ

5 голосов
/ 30 июля 2009

Попробуйте недокументированное 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)

* ПРИМЕЧАНИЕ Я добавил некоторые критерии для состояния и сопоставления доступных баз данных.

...