SQL Server, динамически добавляющий имена столбцов в запросе выбора

#sql-server

#sql-сервер

Вопрос:

Ниже приведен мой запрос

 SELECT 
    P.PlanName
    V.Section
FROM 
    app.Plan P
CROSS APPLY 
    (VALUES ('Protective'), ('Effective'), ('EasyClaim')) V(Section);
 

в запросе это возвращает значение в V.Section , где, поскольку я хочу получить значение этого столбца из табличной переменной.

Комментарии:

1. Для этого вам не нужно VALUES создавать таблицу; просто JOIN ваша таблица app.Plan с табличной переменной *, которую вы не показываете в своем вопросе) Plan .

2. Я могу присоединить запрос к моей табличной переменной, но в моем запросе select мне все равно нужно указать имя столбца моей табличной переменной, данные которой мне нужно извлечь… Это имя столбца будет V.Section КАК [Section]

3. Имя столбца будет в таблице, которую можно изменить, @Sayan, это будут имена столбцов. Вы не можете использовать данные строки для определения имени столбца без динамического SQL, и я сомневаюсь, что это требуется. В вашей табличной переменной уже должно быть 3 столбца с именами Protective , Effective , и EasyClaim ; нет необходимости в создании VALUES таблицы.

4. Вашему подзапросу, который выбирает из вашей табличной переменной, явно указано использовать значение V . SELECT V.Section FROM @TabVariable WHERE Name = P.[PlanName] . Предполагая, что ваша табличная переменная имеет столбец с именем «Section», удалите V. из вашего подзапроса Rating . Вам нужно будет указать псевдоним @TabVariable и ссылаться на него, если имена столбцов совпадают.

Ответ №1:

Как я уже говорил в комментариях, вам не нужна конструкция VALUES таблицы; просто JOIN для вашей табличной переменной:

 SELECT P.Plan,
       TV.Protective,
       TV.Effective,
       TV.EasyClaim
FROM app.Plan P
     LEFT JOIN @TableVariable TV ON P.Plan = TV.Plan; --I assume LEFT JOIN as otherwise you just want
                                                      --SELECT * FROM @TableVariable;
 

Если вы хотите, чтобы значения для были 0 там, где JOIN сбой, тогда вы используете use ISNULL или COALESCE . Например: ISNULL(TV.Protective,0) AS Protective

Комментарии:

1. Я использовал этот запрос, он просто возвращает 6 строк с именами моих планов и разделов, а также Protective, Effective и EasyClaim в качестве столбцов, но где, поскольку мне нужны Protective, Effective и EasyClaim в качестве строк рядом с каждым планом

2. Я думаю, что пришло время для выборки данных и ожидаемых результатов, @Sayan; ты не придаешь этому никакого смысла.