2010-12-06 17 views
3

ビューに列が存在する場合は何とか選択できますが、列が存在しない場合は無視できますか?SQL条件付き列存在

SELECT 
    CASE 
     WHEN EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyView' AND COLUMN_NAME = 'MyColumn') 
      THEN MyView.MyColumn 
     ELSE NULL 
    END AS [Sometimes] 
FROM 
    MyView 

"Msg 207 Invalid column name"エラーを返します。

おそらく、そのエラーを無視するオプションはありますか?

+3

必要性は、あなたのデータモデルについて大きな疑問を提起しています。 –

+0

私は同意します。それが「私の」データモデルだったなら...それを変えよう! :) – EdGruberman

答えて

2

あなたは、動的SQL使用してそれを行うことができます:あなたができる最善の

declare @sql varchar(200) 
IF EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyView' AND COLUMN_NAME = 'MyColumn') 
BEGIN 
    select @sql = "SELECT Column1m Column2, MyColum from MyView" 
END 
ELSE 
BEGIN 
    select @sql = "SELECT Column1m Column2, null as MyColum from MyView" 
END 

-- executes dynamic sql 
EXEC @sql 
+2

あなたの例では動的SQLの必要はありません! 'if' /' else'で十分です。 –

+0

これは機能しました。私は動的SQLに頼る必要がありません。それはいつも私に "不正をする"のように感じます。私はいくつかの他の言語でいくつかのロジックをスクリプトするかもしれない。しかし、それは動作します!そして、おそらく私は今日になるほど良いものです。提案していただきありがとうございます。 – EdGruberman

1

いいえ、これはできません。他に何もなければ、列アクセスはコンパイルされなければならず、これは、それを抑制する式が評価される前に起こります。このためには、オンザフライでSQLを生成する必要があります。

1

if EXISTS(SELECT 1 FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'MyView' AND COLUMN_NAME = 'MyColumn') 
Select MyView.MyColumn from MyView 
else 
Select NULL MyColumn 
+0

SQL 2008 R2では、これでもMsg 207 Invalid列名が返されました。 – EdGruberman

+0

@EdGrubermanあなたが正しいです、私は、他の部分でMyViewから削除する必要がありました –

+0

あなたの強さはbernd_kに感謝しています。ただし、この編集は、2行目のmsg 207エラーを返しました。 – EdGruberman