Переименование столбцов в запросе из результата другой таблицы

#sql #sql-server #tsql

Вопрос:

У меня два стола. A содержит данные, а B содержит объяснение столбцов для A

 Select * from tableA
 
 |ID | A | B | C |
|---|---|---|---|
|1  | ? | ? | ? |
|2  | ? | ? | ? |
|3  | ? | ? | ? |
|4  | ? | ? | ? |
|5  | ? | ? | ? |
 
 Select * from tableB
 
 |col|  Desc  |
|---|--------|
|A  | Value1 |
|B  | Value2 |
|C  | Value3 |
 

Результат, который я хотел бы получить

 |ID | Value1 | Value2 | Value3 |
|---|--------|--------|--------|
|1  |    ?   |    ?   |    ?   |
|2  |    ?   |    ?   |    ?   |
|3  |    ?   |    ?   |    ?   |
|4  |    ?   |    ?   |    ?   |
|5  |    ?   |    ?   |    ?   |
 

Есть ли возможность переименовать столбцы с помощью скрипта вместо этого, используя следующий код? Поскольку столбцов более 40, и у меня есть несколько таблиц, которые нужно преобразовать в представление, это не очень хорошая практика для создания и поддержания представления

 Select A as Value1, B as Value2, C as Value3 From TableA
 

Я попытался использовать разные ключевые слова для поиска в Google, однако в результате все они были переименованы вручную. Может быть, это потому, что я использую неправильные ключевые слова

Заранее спасибо

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

1. В соответствии с руководством по вопросам, пожалуйста, покажите, что вы пробовали, и расскажите нам, что вы нашли (на этом сайте или в другом месте) и почему это не соответствует вашим потребностям. И, пожалуйста, не публикуйте изображения кода, данных, сообщений об ошибках и т. Д. — Скопируйте или введите текст в вопрос. Пожалуйста, зарезервируйте использование изображений для диаграмм или демонстрации ошибок рендеринга, вещей, которые невозможно точно описать с помощью текста.

2. Из того, что вы описали, вам нужно будет использовать динамический SQL. Но как вы вообще попали в этот сценарий ?

3. @Белка Моя компания использует продукт Oracle. Я получил доступ к базе данных несколько дней назад после того, как мой коллега ушел в отставку. Я думаю, что эта структура именования предназначена для покрытия конфиденциальных данных и для согласованности имен~

Ответ №1:

Вам нужно сформировать Dynamic Query и затем выполнить его с помощью sp_executesql


 DECLARE @sql    NVARCHAR(MAX);
    
SELECT  @sql = STRING_AGG(QUOTENAME(col)   ' AS '   QUOTENAME([Desc]), ',')
FROM    tableB;

SELECT  @sql = 'SELECT ID, '
               @sql 
               ' FROM tableA';
PRINT   @sql;
EXEC    sp_executesql @sql;
 

Ответ №2:

Сначала спасибо за ответ @Squirrel. Однако STRING_AGG он несовместим с TSQL.

То, как я решаю, чем-то похоже на него.

 DECLARE @query    NVARCHAR(MAX);
DECLARE @sql    NVARCHAR(MAX);

SELECT @sql = COALESCE(@sql   ',', '')   col   ' AS '   QUOTENAME(DESCR)
FROM    tableB;

SELECT  @query= 'SELECT '   @sql   ' FROM tableA';

PRINT(@query);
EXEC(@query);