0

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

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

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

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

4

2 回答 2

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 SourceasMS Excel然后您确定您的Destination身份并确保您Database要放置它的身份。

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

使用 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

在此处查看源代码

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

在此处查看其链接。

于 2013-06-17T17:34:52.843 回答
0

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

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

城市的表达示例:

如果您的文件变量包含: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)

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

编辑:我实际上不是 100% 确定这将与动态 Excel 文件和表定义一起使用。

于 2013-06-17T18:39:28.443 回答