2009-07-30 11 views
3

SQL Serverのデータ辞書に精通しているわけではありませんが、私がしようとしていることは可能であると仮定しています。テーブル 'x'を含むすべてのデータベースを検索するSQL Serverのデータ辞書

私たちは別の名前の下に、レプリケートされたデータベースの数を持っていると言う:

クライアント1 クライアント2 クライアント3のではなく命名規則に依存している、私は彼らがキーを含めるかどうかに基づいて、これらのデータベースを識別するために期待していましたテーブル、それをMyTableと呼んでください。したがって、次が必要だったようなクエリを考え始めた:私は、直接または間接的にsys.databasesするSYS.TABLESに参加する方法を見ることができないとして、これは動作しません

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

を、またSYS.TABLESすべてのデータベースの完全なテーブルセットではなく、アクティブデータベースに基づくビューです。

誰でもこの状況に適したクエリを特定できますか?

答えて

5

文書化されていないsp_MSforeachdb

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

クエリを動的に

(ここでは標準の動的SQL警告/不承認を挿入)SELECTステートメントを構築することであるとして、それを行うために頭に浮かぶ唯一の方法を試してみてください
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) 

*注記使用可能なデータベースの状態と照合の基準をいくつか追加しました。

+3

+1私の目的のために以下に適合しました。単一のクエリ結果が必要でした。誰かが持っているなら、まだ純粋な質問の答えを望んでいます。 表#ClientDbsに ( 名前はvarchar(MAX) ) master.sys.sp_MSforeachdb 'を使用するEXECUTEを作成しますか? INSERT INTO #ClientDbs SELECTはTABLE_NAME LIKE '' のプロフィール '#ClientDbs DROP TABLE #ClientDbsから' " SELECT * FROM INFORMATION_SCHEMA.TABLES をTABLE_CATALOG – MattH

関連する問題