基于交叉引用表的别名列

时间:2012-02-21 20:13:59

标签: sql sql-server sql-server-2008

我有一个包含超过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 个答案:

答案 0 :(得分:3)

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;

答案 1 :(得分:0)

最简单的方法是添加一个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'