Я пытаюсь получить текстовый результат от 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
Вы пытаетесь сделать слишком много за один раз. Такой «SQL-in-SQL» не работает. Что вам нужно сделать, это запросить схему и сгенерировать одну строковую переменную, содержащую новый оператор SQL * (SQL, который записывает SQL) *. Затем, в качестве отдельного шага, вы можете запустить эту строку в виде SQL-заявления с помощью 'EXEC sp_executesql', который также поддерживает параметризованные запросы. Google 'Dynamic-SQL и SQL-Server' для более подробной информации. – MatBailie
Какова цель этого требования? возможно, есть более простой способ добраться туда ... – Paolo
У моей БД может быть и не может быть столбец «OPTION_CATEGORY_ID» внутри def. Я хочу использовать тот же запрос в обоих случаях, но когда он существует, я хочу, чтобы нижний регистр генерировал правильный перевод текста для идентификатора int. –