我有一个包含超过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
设置为动态生成的所有首字母缩略词列表作为最终列名。这甚至是一种可行的方法吗?
答案 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'