2011-12-14 2 views
0

私はシステムテーブルを見つけたり、いくつかの結合を行って私のサーバのすべてのデータベースのすべてのスキーマのすべてのテーブルのすべてのカラムを見つけることができるテーブルを取得しようとしています。SQL Server 2008のすべてのデータベース、スキーマ、テーブル、および列の情報を含むシステムテーブルまたはビュー?

私は学術目的でこれをやっているので、ストアドプロシージャや関数を使用することはできません。自分で作成する必要があります。

ポイントは、データベース名、スキーマ名、テーブル名を入力パラメータとして受け取り、格納されているすべての列のリストをスローするストアドプロシージャまたは関数を作成することです。ただし、テーブル名を受け取らない場合私は、指定されたデータベースとスキーマに含まれるすべてのテーブルのすべての列を一覧表示する必要があります。入力パラメータとしてスキーマ名も受け取らない場合は、指定したデータベース内のすべてのスキーマのすべてのテーブルのすべての列をリストする必要があります。

アイデア?私が言うように、私はこれを行うためにストアドプロシージャや関数を使用することはできません。

+0

私は多くのシステムテーブルを見てきました、私は、文字列を形成しようとしたEXECは、ExecuteSQLでそれらを実行するが、非常に混乱になってきた、私はそれを – user1073816

+0

を行うには良い方法があるはずと思い、私は考えていません典型的なシステム・カタログ・ビューのどれも現在のデータベースを超えます。したがって、**すべての**データベースが必要な場合は、データベースを繰り返し処理し、それぞれのシステムカタログビューを調べる必要があります –

+0

この繰り返しは動的SQLを介してのみ可能ですか? – user1073816

答えて

0

これは、あなたがcurrectユーザが現在のデータベースのアクセス可能な内のすべてのテーブルのすべての列のために必要なものです:

http://msdn.microsoft.com/en-us/library/ms188348.aspx

すべてのデータベースから同じことを見つけるには、それぞれに接続する必要がありますデータベースを開き、システムビューにアクセスします。

dbaユーザーとして接続すると、すべてのスキーマのすべての表にアクセスできます。

+0

ありがとうございますが、それはポイントではありません、私はそれ以外のデータベースからそれを実行することができる必要があります私はスキーマ、テーブル、カラムを取得したい – user1073816

+0

あなたのcurrectから他のデータベースへのDBリンクが必要データベースにアクセスします。 – Raihan

+0

db-linkを宣言して使用するにはどうすればよいですか? Transact-SQLとして使用することができますか、それとも動的SQLを使用する必要がありますか?私は – user1073816

0

sysスキーマには、重要なテーブルがあります。 sys.databases、sys.schemas、sys.tables、sys.columnsのすべてが簡単に結合され、必要に応じてフィルタリングされます。

sp_msforeachdb 'SELECT t.name FROM [?].sys.schemas s INNER JOIN [?].sys.tables t ON s.[schema_id] = t.[schema_id] INNER JOIN [?].sys.columns c ON c.[object_id] = t.[object_id]';

+0

はい、問題は、これらのテーブルが私が現在使用しているデータベースでのみ機能することです。プロシージャまたは関数が格納されているデータベースとは異なるデータベースに対して、そのプロシージャまたは関数を実行できる必要があります。 – user1073816

+0

文書化されていないsp_msforeachdbを使用するか、独自の方法で各データベースをループする必要があります。 – dataGoat

関連する問題