我正在使用rowset将excel数据导入sql 2008
列名最终为F1,F2,F3等等。
然而,第一行数据包含实际上应该是列名的值。
例如,
F1 F2 F3 F4
---------------------------------------------------
BoxName BoxDesc Entity EntityDesc
我想将列重命名为第一行的值,因此列F1成为BoxName,F2成为BoxDesc。
此外,我希望能够这样做,即使列的顺序发生变化,也可以使用变量作为表名,或者如果列名更改,则列数会发生变化。
您的帮助表示赞赏。
感谢,
KS
答案 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