2011-07-11 8 views
2

(SQL Server 2008)データベースからさまざまなテーブル名と列名を選択しようとしています。データベースはかなり大きいです。同じサーバー上に複数のデータベースがあり、それぞれにさまざまなスキーマなどがあります。一度に複数の部分の識別子が含まれていると、私は立ち往生しています。たとえば、データベースの下のテーブルのリストを取得するには、これは正常に動作します。複数の部分の識別子でテーブル名を検索

SELECT [name] 
FROM DatabaseOne.sys.tables 
ORDER BY [name] 

次に、特定のスキーマの下でテーブルを取得したいとします。例:

SELECT [name] 
FROM DatabaseOne.SchemaOne.sys.tables 
ORDER BY [name] 

しかし、私はエラーを取得する:

​​

問題の大部分は、おそらくそれは、彼らがいても何場合、私は本当に(スキーマについては何も知らないということです)。

また、テーブル内で列名を検索する場合は、DatabaseOne.SchemaOne.TableOneを使用します。

ご協力いただければ幸いです。

+0

sysはスキーマなので、yourschema.sys.tablesというものはありません(少なくともあなたのスキーマのようなものはありません。少なくとも組み込みのメタデータにはありません。 SQL Serverでは維持されません)。 sys.tables(JNKが指摘しているように)には、スキーマに関係なく、すべてのユーザーテーブルが含まれています。 –

+0

本当に_sys_が何であるか分かりませんでした。ありがとうございました。 – StructuredQueryLlama

答えて

1

4つの部分名を使用する場合、最初の部分はリンクサーバーの名前であると仮定します。

システムテーブルはsysスキーマにあり、他のすべてのスキーマ(dboなど)のデータが含まれています。

には、各表がどのスキーマにあるかを指定するschema_id値があります。スキーマを含むsys.schemas表もあります。

あなたのスキーマ名を知っている場合、あなたは

SELECT [name] 
FROM DatabaseOne.sys.tables t 
INNER JOIN sys.schemas s 
    ON s.schema_id = t.schema_id 
WHERE s.name = 'MySchema' 
ORDER BY [name] 

あなたはまた、s.name評価にIN評価を行うことで複数のスキーマを確認することができます行うことができます。

+0

ご返信ありがとうございます。私はそれを少し修正して仕事をしなければならなかった。 _DatabaseOne_の下のスキーマは、_sys.schemas_には表示されません。しかし、それらは_DatabaseOne.sys.schemas_の下で行います。将来的にはこのトピックを読んですることができる人にとって、これは私のために働いた:。 'トンを選択し、[名前] DatabaseOne.sys.tables FROM トンINNERはDatabaseOne.sys.schemasの s.schema_id = T ONを登録しよう。 schema_id WHERE s.name = 'MySchema' ORDER BY t。[name] '。 JNKありがとうございます。編集:書式設定。 – StructuredQueryLlama

+0

@Structured - メタデータテーブル( 'sys.schemas'など)を完全修飾する必要があるかもしれません。別のDBのコンテキストで実行するとうまくいかず、何が起こったかのように聞こえます。 – JNK

関連する問題