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