将数据从Excel导入SQL DB表后,按文件名标识记录

时间:2012-12-17 04:41:35

标签: sql-server tsql excel-2010

我仍然是编写SQL脚本的新手。我有一个脚本导入许多excel文件(可能达到1000+)。其中一些Excel电子表格只有一行,有些行超过50行。我将所有这些excel电子表格导入到一个表格中,并且希望能够添加一个列,用于标识记录来自哪个Excel电子表格。因此,第1行到第10行可能来自ExcelSpreadsheetA.xlsx,第11行到第15行可能来自ExcelSpreadsheetB.xlsx。我可以在导入过程中设置此标识吗?

我使用此脚本从excel执行导入:

select * 
into SQLServerTable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=D:\testing.xls;HDR=YES', 
'SELECT * FROM [Sheet1$]')

我想要做的是在脚本的末尾添加逻辑,例如:

update sqlservertable
set filename = testing.xls

但我希望它只为从该特定文件名导入的记录设置filename属性。理想情况下,我希望决赛桌看起来与下面的类似。

Col1   Col2   Col3   Filename
=====  =====  =====  =========
1      A      B      export1.xlsx
2      C      D      export1.xlsx
3      E      F      export1.xlsx
4      G      H      export5.xlsx
5      I      J      export8.xlsx
6      K      L      export8.xlsx

@Pondlife 这个脚本做我想做的事。

select *, 'file1.xls' as 'Filename'
into dbo.SQLServerTable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\testing.xls;HDR=YES', 'SELECT * FROM [Sheet1$]')

但是,现在我需要能够将后续导入到同一个数据库中,这是我正在使用的脚本,但它在我身上错误。

INSERT INTO dbo.SQLServerTable 
Select *, 'File2.xlsx' as 'FileName' 
FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0', 'Excel      12.0;Database=D:\Convert\Converted\File2.xlsx;HDR=YES', 'SELECT * FROM [Worksheet$]')

2 个答案:

答案 0 :(得分:1)

假设您的SELECT查询已经有效,那么只需将文件名添加到列列表的末尾:

select *, 'file1.xls' as 'Filename'
into dbo.SQLServerTable 
FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=D:\testing.xls;HDR=YES', 'SELECT * FROM [Sheet1$]')

作为标准评论,代码中为don't use SELECT *

答案 1 :(得分:0)

是的,您需要在现有表中设置带有外键的文件表,但如下所示:

tbl1 files table
id | path | description

tbl2 data table
id | fileId | col1value | col2value ... | colnvalue

希望这更清楚。