【问题标题】:Mass data insert into SQL Server?将海量数据插入 SQL Server?
【发布时间】:2012-01-10 22:13:23
【问题描述】:

我在 Excel 工作簿中有 8 个工作表,我想将它们导入到 SQL Server DB 中的单独表中。

我想将 8 个工作表中的每一个都导入到一个单独的表中,理想情况下,表名与工作表选项卡名称一致,但最初,我只想将数据放入表中,因此任意表名适用于暂时也是。

每个工作表(以及扩展的表格)中的数据格式是相同的(并且将是相同的),所以我认为可以使用某种循环来执行此操作。

数据如下所示:

Universe    Date        Symbol      Shares  MktValue    Currency
SMALLCAP    6/30/2011   000360206   27763   606361.92   USD
SMALLCAP    6/30/2011   000361105   99643   2699407.52  USD
SMALLCAP    6/30/2011   00081T108   103305  810926.73   USD
SMALLCAP    6/30/2011   000957100   57374   1339094.76  USD

SQL 中的表格格式将/应该与以下内容保持一致:

CREATE TABLE dbo.[market1] (
[Universe_ID] char(20),
[AsOfDate] smalldatetime,
[Symbol] nvarchar(20),
[Shares] decimal(20,0),
[MktValue] decimal(20,2),
[Currency] char(3)
)

我愿意使用 SQL/VBA/C++ 或某种组合来执行此操作(因为这些是我知道并可以使用的语言)。关于如何最好地解决这个问题有什么想法吗?

【问题讨论】:

  • 这是您要按计划运行的作业还是一次性导入?你可以使用 DTS 或 SSIS 吗?
  • 检查 Sql Server 的批量导入功能。您可以将您的 excel 保存为 csv,然后将其导入。
  • @Robert - 假设一次。将其设置为按计划运行(通过 Windows 调度程序)是次要的。什么是 DTS 和 SSIS?
  • @SebastianPiu - 我计划使用 BULK INSERT 作为其中的一部分。它是否允许在多张纸上导入?
  • @Chris - 我想我应该问一下您是否有企业管理器和安全性来直接加载数据库?还是您只有开发者用户名和密码,所以您必须使用应用程序来完成?

标签: c++ sql sql-server excel vba


【解决方案1】:

您可以使用 SSIS 或 DTS 包来导入它们。这里有一些参考资料可以帮助您前进。

Creating a DTS Package - pre 2005

Creating a SSIS Package - 2005 forward

【讨论】:

  • 感谢您的建议。我知道导入向导,但我试图避免这样做 8 次,每个工作表一次。以编程方式执行此操作没有好方法吗?
  • 确保您可以通过编程方式完成,但我认为这会更容易。为每个工作表创建导入脚本并修改数据源。这听起来比编写程序来读取工作表、创建表格、然后输入数据更容易。另一种选择是将 Excel 直接连接到 SQL 并以这种方式加载数据。
  • 我会投赞成票,但 SSIS 被部署为 SQL Server 本身的一部分;包的开发(尽管比 DTS 好得多)、部署和维护(源代码控制)都很痛苦。此外,错误处理相当差,您需要 DBA 来支持它。
  • @Juliusz 您正确的 SSIS 和 DTS 包可能会很痛苦,但对于导入数据,我一直发现它们是最简单的。就像我说的那样,您可以创建一个程序来执行此操作,但在我看来,这比仅进行简单的导入要复杂得多。
【解决方案2】:

对于扩展名为 xlsx 的 Excel 文件(2007 或 2010),我已将它们重命名为 .zip 并将其内容提取到一个目录中,并使用 SQL XML Bulk Load 导入工作表和参考表。当我在 SQL 服务器中拥有所有数据时,我使用基本的 SQL 查询来提取/转换所需的数据到指定的工作表中。 -- 这保留了 SQL 中的“消化”逻辑,并使用 C# 开发的最小外部 VB 脚本。

链接到 SQL 批量加载 XML 数据:http://support.microsoft.com/kb/316005

【讨论】:

    【解决方案3】:

    在 SQL Management Studio 中,右键单击数据库,然后单击任务,然后单击导入数据。这将带您浏览一些屏幕并创建一个 SSIS 包来导入文件。在此过程中的某个时刻,它会询问您是否要保存包(我也会运行它几次以确保它以您想要的方式导入您的数据)。保存它,然后您可以通过 SQL Server 代理安排将包作为作业运行。 (作业类型将为 Sql Server Integration Services)。

    【讨论】:

      【解决方案4】:

      您可以使用以下脚本

      从 OPENDATASOURCE('Microsoft.Jet.OLEDB.4.0', '数据源=C:\test\xltest.xls;扩展属性=Excel 8.0')...[Customers$]

      SELECT * INTO XLImport4 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\test\xltest.xls', [Customers$])

      SELECT * INTO XLImport5 FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0', 'Excel 8.0;Database=C:\test\xltest.xls', 'SELECT * FROM [Customers$]')

      或者可以使用以下

      从 OPENQUERY(EXCELLINK, 'SELECT * FROM [Customers$]')

      【讨论】:

        猜你喜欢
        • 2014-01-07
        • 2019-02-06
        • 2011-01-16
        • 1970-01-01
        • 2016-01-25
        • 1970-01-01
        • 2011-09-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多