2012-01-16 77 views
0

我使用的行集导入列名Excel数据导入SQL 2008映射SQL行值

的名字最终被F1,F2,F3等等等等的塔

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

例如,

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

我想的列重命名为所述第一行中的值,所以柱F1变为BoxName,F2变为BoxDesc。

此外,即使列的顺序发生更改,并且使用变量作为表名,或者如果列数发生更改或者列名发生更改,我也希望能够执行此操作。

您的帮助表示赞赏。

感谢,

KS

回答

0

尝试使用sp_executesql存储过程,我认为它可以解决你的问题。 Excel文件导入到临时表温度后选择该行与列名,第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 
+0

对不起,我应该说excel文件在实际列名称值所在的行之前有一些额外的行。 我使用HDR = NO,然后在sql中删除额外的行,从而结束第一行中的列名值行(如果有意义的话)。 – Perplexed 2012-01-16 15:56:54

+0

我编辑了代码。 – pistipanko 2012-01-16 16:29:58

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', @[email protected] OUTPUT 
Set @RenameTargetCol1 = 'MyTable.'[email protected] 

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

    Set @Counter = @Counter+1 
END