Существование условного столбца 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».

Возможно, возможен какой-то вариант игнорировать эту ошибку?


person EdGruberman    schedule 06.12.2010    source источник
comment
Необходимость поднимает большие вопросы о вашей модели данных.   -  person OMG Ponies    schedule 06.12.2010
comment
Я согласен. Если бы это была моя модель данных... тогда я бы ее изменил! :)   -  person EdGruberman    schedule 06.12.2010


Ответы (3)


Вы можете сделать это с помощью динамического 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
person ArBR    schedule 06.12.2010
comment
В вашем примере нет необходимости в динамическом SQL! if/else достаточно. - person Martin Smith; 06.12.2010
comment
Это сработало. Я ненавижу прибегать к динамическому SQL. Мне всегда кажется, что меня обманывают. С тем же успехом я мог бы написать логику на каком-нибудь другом языке, хех. Но это работает! И, вероятно, так хорошо, как я собираюсь получить сегодня. Спасибо за предложение. - person EdGruberman; 06.12.2010
comment
У меня почти сработало... в SQL Server 2016 мне пришлось установить varchar(200) на nvarchar(max) и запустить EXEC sp_executesql @sql вместо EXEC @sql. EXEC (@sql) также может работать: sqlservercentral.com/Forums/FindPost757517.aspx - person A N; 18.05.2018

Нет, это невозможно. Доступ к столбцу должен быть скомпилирован, если не что иное, и это происходит до того, как выражение, подавляющее его, будет вычислено. Для этого вам нужно генерировать SQL на лету.

person Marcelo Cantos    schedule 06.12.2010

Лучшее, что вы можете сделать, это

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 
person bernd_k    schedule 06.12.2010
comment
Для SQL 2008 R2 это все равно дало мне Msg 207 Недопустимое имя столбца. - person EdGruberman; 06.12.2010
comment
@EdGruberman, вы правы, мне пришлось удалить из MyView в остальной части - person bernd_k; 06.12.2010
comment
Ваше упорство ценится bernd_k. Однако это редактирование по-прежнему возвращало мне ошибку Msg 207 в строке 2. - person EdGruberman; 07.12.2010
comment
Я использую Microsoft SQL Server 2008 (SP2) — 10.0.4000.0 (Intel X86) 16 сентября 2010 г. 20:09:22 Copyright (c) 1988-2008 Microsoft Corporation Standard Edition для Windows NT 6.1 ‹X86› (сборка 7600: ) -- MyView не существует в моей базе данных, и я получаю следующий результат: MyColumn ----------- NULL (затронуты 1 строка) Возможно, это зависит от какой-то настройки? - person bernd_k; 08.12.2010
comment
Я попробовал это против SQL-Server 2000 и SQL-Server 2005 и получил тот же результат. Даже Query Analyzer (sql 2000) по отношению к SQL-серверу 2008 не показал ошибок msg. - person bernd_k; 08.12.2010
comment
Ах, это потому, что MyView не существует в вашем тесте. Я получаю те же результаты, что и вы, если MyView не существует. Но мой вопрос касается настройки вывода на основе существования столбца в существующем представлении. - person EdGruberman; 09.12.2010
comment
Да, это правда. В этом случае вам нужен динамический SQL. - person bernd_k; 09.12.2010