我有一个包含子文件夹(城市名称)的文件夹,在这些子文件夹中我有excel文件。我必须从子文件夹中获取所有excel文件,并根据城市名称将它们加载到SQL Server表中。文件结构如下。
达拉斯文件夹包含这些文件
我的要求是我必须将汽车数据加载到汽车表中,并将卡车数据加载到卡车表中,根据他们的名字和所有城市文件应该进入同一个表格,如汽车,卡车。我必须根据城市名称创建一个ID列,它可以基于字母顺序 任何人都可以帮助我。
答案 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
标识为您想要的身份。
在使用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中。
城市表达示例:
如果你的文件变量包含: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文件和表格定义。