2012-02-28 4 views
1

私は、SQL Server 2008のクエリは

列が存在するかどうかわからない場合があります照会されている複数のデータベースから選択する方法はありますを使用していますか?次のように

私の現在のコードは次のとおりです。

SELECT Value FROM [database1].[dbo].[table_name] WHERE Name='job_name' AND EXISTS (SELECT 1 FROM [database1].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table_name') 
UNION 
SELECT Value FROM [database2].[dbo].[table_name] WHERE Name='job_name' AND EXISTS (SELECT 1 FROM [database2].INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME='table_name') 

だけ明確にする、私は2つの異なるデータベースから照会しようとしています。どちらのデータベースも同じスキーマを持つ必要がありますが、完全に初期化されていない可能性があり、クエリ対象のテーブルが含まれていない可能性があります。私は1つのクエリでこれをやろうとしています。

+0

データベースとインターフェイスするスクリプト言語では、この種のことがしばしば簡単になります。あなたのテーブルのために 'INFORMATION_SCHEMA.Columns'から適切な列名を取得し、そこから行ってください。 –

+0

あなたの現在のコードには何が問題なのですか? –

+0

テーブルが存在しないか、列またはその両方ですか?質問のタイトルはテーブルを示し、質問自体はテーブルとカラムの両方について話します。 –

答えて

2

クエリで使用される名前は、SQLオプティマイザがクエリの実行を計画しようとする時に存在している必要があります。これは、トリックを行う必要があります。そうでない場合は、関連するテーブルまたはカラムが存在しないことに関する失礼なメッセージが返されます。この周りに標準的な方法はありません。そして、これのまわりに非標準的な方法があることは非常にありそうもありません。

少なくとも、クエリーテキストをそのまま使用する方法はありません。システムカタログクエリ(ネイティブシステムカタログテーブルまたは多かれ少なかれ標準化されている情報スキーマを介して)を実行する準備ができている場合は、実行時にクエリを構築する方法を決定することができます。成功の最大のチャンス。これは珍しい要件です。接続するデータベースの予想される標準からの逸脱を許容するように設計されたプログラムはほとんどありません。

+0

この要件は、アプリケーションが実行されるときにデータベースが作成されるため、アプリケーションが任意の数のマシン(同期のため)で実行されるために必要です。したがって、データベースを作成しているときにマシンがクラッシュし、テーブルの情報がなくてもデータベースが残る可能性があります。 あなたが言うようにこれを行う方法がなく、私はこれを行う正しい方法を受け取っていない場合は、あなたの答えを正しいものとしてマークします。 – Stuart

+0

データベースがクラッシュしてテーブル情報がいっぱいでない場合は、何らかのエラーメッセージが表示されずにクエリを実行しようとしますか? –

+0

アイデアは、各データベースを個別にクエリするのを避けようとしています。テーブルが存在しない場合、明らかな理由でそのデータベースへのアクセスをユーザに与えません。これは、上記のクエリが指定されたテーブルを含まない場合、データベースをスキップできるようにするためです。 – Stuart

-1

クエリの各部分に別のフィルタを追加して、指定した列が存在するかどうかをテストするだけです。

and exists(select 1 from sys.columns where object_id = object_id('table_name') and name = 'column_name') 
+0

いい考えですが、うまくいかないでしょう。構文解析プログラムは名前を検証しようとしますが、文が何らかの速度で実行されようとしているときにテーブル名が存在しなければなりません。 –

+0

ああ、そうです。 OPは、テーブルが最初に存在するかどうかをテストしてから、両方のデータベースの結果を一時テーブルに追加する必要があります。 – cmotley

+0

私はすでに述べたように、カラムのデータは正しいはずなので、私はすでに持っているのと同じ問題があると思います。 – Stuart