Псевдоним столбцов на основе таблицы перекрестных ссылок - PullRequest
0 голосов
/ 22 февраля 2012

У меня есть таблица с более чем 400 столбцами, и они названы с помощью архаичной системы именования нашего поставщика. Мне нужно переместить эти данные в новую таблицу, в которой используются соглашения об именах нашей компании, поэтому мне нужно изменить имена этих 400 столбцов.

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

Acronym  | Name
----------------
A        | ColumnNameA
B        | ColumnNameB
C        | ColumnNameC

и т.д ...

Итак, мой вопрос таков: Если бы это было всего несколько строк, я мог бы легко сделать

SELECT 
   A AS ColumnNameA, 
   B AS ColumnNameB 
FROM 
   Table

Но слишком много столбцов, чтобы сделать это вручную. Каков наилучший способ динамического изменения имен столбцов в операторе SELECT на основе таблицы перекрестных ссылок?

Мои усилия на данный момент:

Я думал что-то вроде

SET @sqlCommand = 'SELECT ' + @columns + ' FROM Table'
EXEC (@sqlCommand)

но я понятия не имею, как установить @columns в качестве динамически генерируемого списка всех сокращений в качестве окончательных имен столбцов. Это даже жизнеспособный подход?

Ответы [ 2 ]

3 голосов
/ 22 февраля 2012
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql += ',' + QUOTENAME(Acronym) + ' AS ' + QUOTENAME(Name)
FROM dbo.AcronymTable;

SET @sql = 'SELECT ' + STUFF(@sql, 1, 1, N'') + ' FROM dbo.Table;';

PRINT @sql;
--EXEC sp_executesql @sql;
0 голосов
/ 22 февраля 2012

Самый простой способ - добавить поле int, которое определяет порядок столбцов, чтобы он соответствовал от источника к цели. Тогда вы можете:

DECLARE @sql varchar(max)

SET @SQL = 'INSERT INTO dbo.Target SELECT '

SELECT @SQL = @SQL + Acronym + ','
FROM ConversionTable
ORDER BY OrderColumn

SET @SQL = LEFT(@SQL, (LEN(@SQL) - 1))    

SET @SQL = @SQL + ' FROM SourceTable'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...