【问题标题】:Import from excel to Sql Server从 excel 导入到 Sql Server
【发布时间】:2013-07-13 01:30:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您有 32 位或 64 位操作系统吗?您打算使用内置的导入功能还是自己构建? MS SQL Server 以外的其他软件包可以使用吗?如果不是,是否可以使用除 SQL Server Management Studio 之外的其他属于 MSSQL 的软件(如 SSIS)?当您的问题涵盖这些要点时,您可能会得到满足您要求的答案。
  • 我想说的是,在现实世界中,您实际上所做的是使用单一导入方法,然后每次手动清理 Excel 数据以匹配。当然,这在一定程度上取决于数量,但是当您有一些人在编写电子表格时,您就无法考虑所有事情。

标签: asp.net sql-server ssis bulkinsert sqlbulkcopy


【解决方案1】:

SSIS

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

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

C#

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

【讨论】:

    【解决方案2】:

    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$]')
    

    【讨论】:

      【解决方案3】:

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

      另一种方法是编写需要数天(或数周)才能开发和测试的代码。这完全取决于您的时间对您的雇主而言价值多少。

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

      【讨论】:

        【解决方案4】:

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-02
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多