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