2015-09-04 2 views
1

Я пытаюсь получить текстовый результат от CASE(def.OPTION_CATEGORY_ID) в выборе, но мне сложно выполнять условия.Как использовать имя столбца SQL, только если столбец существует?

Что я пытаюсь сделать, так это проверить, является ли OPTION_CATEGORY_ID существующим столбцом в sys.columns. Если это так, я пытаюсь сделать int для перевода текста с помощью When - Then внизу, но SQL не знает имя столбца, поэтому CASE(def.OPTION_CATEGORY_ID) не работает, потому что имя столбца недействительно.

Есть ли способ позвонить def.OPTION_CATEGORY_ID с использованием псевдонима, чтобы SQL не провалил его перед рукой? Благодаря

SELECT DISTINCT * 
    FROM 
     (SELECT def.OPTION_DEF_ID AS 'Def ID', 
       ass.ASSET_NAME AS 'Asset Name', 
       CASE(def.OPTION_TYPE_ID) 
        WHEN 1 THEN 'A' 
        WHEN 2 THEN 'B' 

       END AS 'Option Type', 
       case when exists (SELECT name 
       FROM sys.columns 
       WHERE Name = 'OPTION_CATEGORY_ID' 
        AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) 

    then 
     -- Column Exists 
     CASE(def.OPTION_CATEGORY_ID) 
        WHEN 1 THEN 'C' 
        WHEN 2 THEN 'D' 
        WHEN 3 THEN 'E' 
        WHEN 4 THEN 'F' 


       end 
       End AS 'test' , 

     -- the rest of the select 
+2

Вы пытаетесь сделать слишком много за один раз. Такой «SQL-in-SQL» не работает. Что вам нужно сделать, это запросить схему и сгенерировать одну строковую переменную, содержащую новый оператор SQL * (SQL, который записывает SQL) *. Затем, в качестве отдельного шага, вы можете запустить эту строку в виде SQL-заявления с помощью 'EXEC sp_executesql', который также поддерживает параметризованные запросы. Google 'Dynamic-SQL и SQL-Server' для более подробной информации. – MatBailie

+0

Какова цель этого требования? возможно, есть более простой способ добраться туда ... – Paolo

+0

У моей БД может быть и не может быть столбец «OPTION_CATEGORY_ID» внутри def. Я хочу использовать тот же запрос в обоих случаях, но когда он существует, я хочу, чтобы нижний регистр генерировал правильный перевод текста для идентификатора int. –

ответ

2

Если вы хотите, чтобы выбрать столбец, и вы не уверены, если он существует, то вы не можете написать его в явном виде в коде, и ожидать его компиляции.

Вы должны построить заявление динамически основанный на выполнения времени информации из которых столбец существует или нет:

DECLARE @statement VARCHAR(MAX) 

IF((SELECT COUNT(*) 
       FROM sys.columns 
       WHERE Name = 'OPTION_CATEGORY_ID' 
        AND Object_ID = Object_ID(N'TFC_OPTION_DEFINITION')) > 0) 
BEGIN 
SET @statement = --assign a query which uses OPTION_CATEGORY_ID 
END 
ELSE 
BEGIN 
SET @statement = --assign a query which does not use OPTION_CATEGORY_ID 
END 

EXEC sp_executesql @statement 
+0

спасибо за помощь –

Смежные вопросы