【发布时间】:2012-01-10 22:42:33
【问题描述】:
我有一个客户需要将大型 Excel 文件(72K 行)中的行导入到他们的 SQL Server 数据库中。该文件由系统用户上传。当我们尝试在用户上传时同时上传和处理这些时,性能成为一个问题。现在我们只需将其保存到磁盘,管理员将其拾取并将其拆分为 2K 行,并通过上传工具逐一运行。有没有更简单的方法可以在不影响性能或超时的情况下做到这一点?
【问题讨论】:
标签: sql-server excel ssis
我有一个客户需要将大型 Excel 文件(72K 行)中的行导入到他们的 SQL Server 数据库中。该文件由系统用户上传。当我们尝试在用户上传时同时上传和处理这些时,性能成为一个问题。现在我们只需将其保存到磁盘,管理员将其拾取并将其拆分为 2K 行,并通过上传工具逐一运行。有没有更简单的方法可以在不影响性能或超时的情况下做到这一点?
【问题讨论】:
标签: sql-server excel ssis
如果我正确理解您的问题,您会得到一个大电子表格,需要将其上传到 SQL Server 数据库。目前我不确定您的流程为何缓慢,但我认为数据量不应该天生就很慢。
根据您可用的开发工具,应该可以在合理的时间内将其导入。
SSIS 可以读取 excel 文件。您可以安排一个定期唤醒并检查新文件的作业。如果找到该文件,则使用数据流任务将其导入临时表,然后可以使用 SQL 任务在其中运行一些处理。
如果您可以使用 .Net,那么您可以编写一个应用程序,通过 OLE 自动化 API 读取数据并通过 SQLBulkCopy 将其加载到暂存区。您可以通过 Excel COM API 将整个范围读入变量数组。这不是超快,但对于您的目的应该足够快。
如果您不介意使用 VBA,那么您可以编写一个执行类似操作的宏。但是,我不认为传统的 ADO 具有批量加载功能。为此,您需要导出 .CSV 或类似于可以从服务器看到的驱动器的文件,然后从该文件中导出 BULK INSERT。您还必须为输出 .CSV 文件创建一个 bcp 控制文件。
从用户提供的电子表格进行无头导入总是很麻烦,因此通过桌面应用程序进行导入有很多优点。主要好处是错误报告。无头工作实际上只能发送带有一些状态信息的电子邮件。如果您有一个交互式应用程序,用户可以对文件进行故障排除并进行多次尝试,直到他们正确为止。
【讨论】:
我可能是错的,但是从您的描述来看,您似乎是在应用程序中的代码中进行处理(即上传文件,然后处理上传的代码处理导入,可能是逐行处理基础)
无论如何,我在使用 SSIS 导入大型数据集方面取得了最大的成功。我还设置了一个电子表格作为链接服务器,它可以工作,但对我来说总是有点笨拙。
看看this article,它详细介绍了如何使用几种不同的方法导入数据,即:
【讨论】: