2010-12-06 51 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

的必要性提出了關於你的數據模型更大的問題。 – 2010-12-06 16:57:31

+0

我同意。如果只有它是「我的」數據模型......那麼我會改變它! :) – EdGruberman 2010-12-06 17:38:54

回答

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`就足夠了。 – 2010-12-06 16:56:59

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