将sql行值映射到列名

时间:2012-01-16 15:26:45

标签: sql sql-server-2008

我正在使用rowset将excel数据导入sql 2008

列名最终为F1,F2,F3等等。

然而,第一行数据包含实际上应该是列名的值。

例如,

F1         F2           F3              F4
---------------------------------------------------
BoxName    BoxDesc      Entity          EntityDesc

我想将列重命名为第一行的值,因此列F1成为BoxName,F2成为BoxDesc。

此外,我希望能够这样做,即使列的顺序发生变化,也可以使用变量作为表名,或者如果列名更改,则列数会发生变化。

您的帮助表示赞赏。

感谢,

KS

2 个答案:

答案 0 :(得分:0)

尝试使用sp_executesql存储过程,我认为它可以解决您的问题。将excel文件导入临时表temp后,选择具有列名的行,在这种情况下为第4行:

DECLARE @F1Col AS VARCHAR(50), @F2Col AS VARCHAR(50), @F3Col AS VARCHAR(50), @F4Col AS VARCHAR(50)


    SELECT TOP 4 @F1Col = F1,
    @F2Col = F2,
    @F3Col = F3,
    @F4Col = F4
    FROM temp

    SELECT F1 AS @F1Col,
    F2 AS @F2Col, 
    F3 AS @F3Col, 
    F4 AS @F4Col
    EXCEPT
    SELECT TOP 4 F1 AS @F1Col,
    F2 AS @F2Col,
    F3 AS @F3Col,
    F4 AS @F4Col
    FROM temp

答案 1 :(得分:0)

我最后使用sp_executeSql使用动态sql方法。

首先,我得到了我需要的最大列数。

然后我使用while循环迭代重命名标题的列。

--Get the column name from the 4th row and store in @NewName, actual col name is F{n}
WHILE (@Counter < @MaxCols+1)
BEGIN
    Set @RowColVal = 'F'+RTrim(@Counter)
    Set @tmpSQL = N'SELECT @NewName = ' + @RowColVal + ' from MyTable WHERE ID=4'
EXEC sp_executesql @tmpSQL, N'@NewName nvarchar(50) OUTPUT', @NewName=@NewColName OUTPUT
Set @RenameTargetCol1 = 'MyTable.'+@RowColVal

    --rename column
    EXEC sp_RENAME @RenameTargetCol1, @NewColName, 'COLUMN'

    Set @Counter = @Counter+1
END