从多个子文件夹中提取Excel文件,并根据城市名称将它们加载到sql server表中

时间:2013-06-17 16:27:08

标签: sql-server-2008 ssis

我有一个包含子文件夹(城市名称)的文件夹,在这些子文件夹中我有excel文件。我必须从子文件夹中获取所有excel文件,并根据城市名称将它们加载到SQL Server表中。文件结构如下。

达拉斯文件夹包含这些文件

  • DALLAS_Cars_2011.xls
  • DALLAS_Trucks_2011.xls
  • DALLAS_Bikes_2011.xls

我的要求是我必须将汽车数据加载到汽车表中,并将卡车数据加载到卡车表中,根据他们的名字和所有城市文件应该进入同一个表格,如汽车,卡车。我必须根据城市名称创建一个ID列,它可以基于字母顺序 任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

首先,我使用的是SQL Server Express 2008(R2),我可以将MS Excel文件导出到我的数据库中。我至少知道三种方法:

 1) Using Import and Export Data (whether 32 bit or 64 bit).
 2) Using SQL per se
 3) Programmatically like using C# or VB.net

导入和导出数据中,只需转到所有程序下的MS SQL Server,然后按照指示进行操作。您将Data Source指定为MS Excel,然后确定您的Destination,并确保您要将Database标识为您想要的身份。

enter image description here

enter image description here

enter image description here

使用SQL 中,您只需使用以下命令,只需根据自己的需要进行更改。

SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;HDR=YES;Database=c:\CityName\DALLAS_Cars_2011.xls','select * from [sheet1$]')

但是,如果您遇到以下问题:

 OLE DB provider 'Microsoft.Jet.OLEDB.4.0' cannot be used for distributed queries because the provider is configured to run in single-threaded apartment mode.

尝试添加以下行:

sp_configure 'show advanced options', 1;
GO
RECONFIGURE;
GO
sp_configure 'Ad Hoc Distributed Queries', 1;
GO
RECONFIGURE;
GO
SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;HDR=YES;Database=c:\CityName\DALLAS_Cars_2011.xls','select * from [sheet1$]')

否则,如果您仍然遇到可能意味着您的MS Excel is 32 bit并且您正在64 bit SQL Server上运行的问题。所以,你最好做第一种方法。

最后,如果您在VB.Net或C#中知道编程,那么您可能会像这样编码:

Dim cn As ADODB.Connection
Dim strSQL As String
Dim lngRecsAff As Long
Set cn = New ADODB.Connection
cn.Open "Provider=SQLOLEDB;Data Source=<server>;" & _
    "Initial Catalog=<database>;User ID=<user>;Password=<password>"

'Import by using OPENDATASOURCE.
strSQL = "SELECT * INTO XLImport6 FROM " & _
    "OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', " & _
    "'Data Source=C:\test\xltest.xls;" & _
    "Extended Properties=Excel 8.0')...[Customers$]"
cn.Execute strSQL, lngRecsAff, adExecuteNoRecords

请参阅来源here

或者您也可以使用EPPlus中的库,就像我在其中一个程序中所做的那样。

请参阅其链接here

答案 1 :(得分:0)

您可以使用SSIS将Excel文件加载到SQL Server中。

  1. 创建3个变量:文件,城市和表格
  2. 为City变量创建表达式,以从File
  3. 中检索City部分
  4. 对表
  5. 执行相同操作
  6. 创建foreach文件枚举器
  7. 将完全限定名称分配给文件变量
  8. 创建包含excel源和ole db目标的数据流任务
  9. 创建一个检索使用文件变量
  10. 的Excel连接
  11. 创建一个ole db连接,将其分配给ole db目标,并选择Table变量作为目标表。
  12. 城市表达示例:

    如果你的文件变量包含:C:\ temp \ Dallas \ Dallas_Trucks_2011.xls

    SUBSTRING(@[User::File], FINDSTRING(@[User::File], "\\", 3) + 1, FINDSTRING(SUBSTRING(@[User::File], FINDSTRING(@[User::File], "\\", 3) + 1, 99), "_", 1) -1)
    

    表达式应返回Dallas。它检索第三个\和第一个_

    之间的部分

    以下表达式通过检索第一个Trucks和第二个_

    之间的部分返回_
    SUBSTRING(@[User::File], FINDSTRING(@[User::File], "_", 1) + 1, FINDSTRING(SUBSTRING(@[User::File], FINDSTRING(@[User::File], "_", 1) + 1, 99), "_", 1) -1)
    

    您还可以在数据流任务中添加派生列,以将城市添加为列。

    编辑:我实际上并非100%确定这适用于动态Excel文件和表格定义。