-3

我的任务是将 excel 数据导入 Sql 服务器。excel数据来自excel模板。有不同的 excel 模板可用于不同的客户,因此 excel 中的列在所有模板中都不相同。必须将数据导入到 SQ1 的一个公用表中。

我用谷歌搜索过,网上有很多可用的样本,但我无法确定哪种方法最好。

我可以请您指导我如何实现上述考虑模板的动态列。

在 excel 模板中,起始行和结束行不固定。

4

4 回答 4

10

SSIS

AData Flow Task是在 SSIS 包内移动数据的主要任务,它与源提供程序的元数据紧密绑定。如果一个源具有 string、int、string,而下一个源具有 string、string、string、string,则元数据对于在同一数据流中的工作来说将是非常不同的。虽然您可以将整数数据强制转换为字符串,但无法克服列数的差异。

在你的情况下,除非你有非常复杂的业务逻辑来应用来自这些电子表格的数据到合并表中,否则我可能会考虑设计 N+1 个包。您将收到的每种可能的 Excel 格式的包。我假设有一些逻辑可以确定文件来自哪个模板(ClientAV1.xlsx、ClientBV2.xlsx 等)。这些包将具有从 Excel 源到 OLE DB 目标的数据流。最终包将是父/控制器/主包。它将根据可用文件处理其他包的协调。

C#

由于您已经标记了 asp.net,我假设您也可以使用 .NET 方法。在这个答案中,我介绍了如何在 .NET 中读取 Excel 文件,当我将其提供给 SSIS 数据流时,没有什么能阻止您发出批量命令以将数据加载到 SQL Server 中。

于 2013-07-13T02:05:11.897 回答
1

SSIS 中的动态列映射非常棘手,您不必担心列映射的最简单方法是使用 Openrowset 选项将数据从 Excel 文件导入到 sql 文件。您可以将其用作命令并将其添加到执行 SQL 任务中:

 SELECT * INTO <TableName> FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\Filename.xls', 'SELECT * FROM [Sheet$]')
于 2013-07-26T20:20:37.293 回答
0

如果您不介意使用在订阅模型上获得许可的付费第三方 SSIS 组件,请仔细查看DataDefractor SSIS。一旦掌握了窍门,您就可以开发一个包来在一天之内导入除最复杂和可变格式的 Excel 工作簿之外的所有工作簿,包括测试。

另一种方法是编写需要数天或数周的代码来开发和测试。这完全取决于你的时间对你的雇主来说值多少钱。

这个组件的问题是当许可证过期时,它会停止工作,所以你需要保持许可证是最新的。他们有一个他们不做广告的永久许可证,但是 IIRC,它需要花费大约 20 或 30 年的订阅费用。

于 2013-07-31T23:34:47.350 回答
0

使用 OpenRowSet 或 OpenDataSource

http://cleancode4devs.blogspot.in/2012/01/import-data-from-excel-to-sqlserver.html

于 2013-08-02T06:56:48.013 回答