【发布时间】:2018-05-29 19:40:13
【问题描述】:
我有大约 80k 条记录的 .csv 文件。文件有大约 15 列,但我只需要 3 列用于插入目的。首先我使用 ColdFusion cfhttp 方法从我的服务器读取文件,然后我尝试使用这种技术在 SQL 数据库表中插入多行。这是一个例子:
<cfsetting requestTimeOut = "36000" />
<cfhttp method="get" url="https://testsite.org/ZipCodes.csv" name="zipData">
<cfquery name="qryZip" datasource="testDB">
INSERT INTO ZipCodes(
z_zip,
z_city,
z_state
)VALUES
<cfloop query="zipData">
(
<cfqueryparam value="#trim(zipData.ZipCode)#" cfsqltype="cf_sql_char" maxlength="5">,
<cfqueryparam value="#trim(zipData.City)#" cfsqltype="cf_sql_varchar" maxlength="50">,
<cfqueryparam value="#trim(zipData.State)#" cfsqltype="cf_sql_char" maxlength="2">
)
</cfloop>
</cfquery>
上面的代码只是一直在加载,我仍然没有在我的表中得到结果。然后我尝试这样做:
<cfloop query="zipData">
<cfquery name="qryZip" datasource="testDB">
INSERT INTO ZipCodes(
z_zip,
z_city,
z_state
)VALUES
(
<cfqueryparam value="#trim(zipData.ZipCode)#" cfsqltype="cf_sql_char" maxlength="5">,
<cfqueryparam value="#trim(zipData.City)#" cfsqltype="cf_sql_varchar" maxlength="50">,
<cfqueryparam value="#trim(zipData.State)#" cfsqltype="cf_sql_char" maxlength="2">
)
</cfquery>
</cfloop>
此方法有效,但在我看来效率非常低,因为我为每条记录打开新的数据库连接,而第一个解决方案应该更有效。此文件中有 80k 条记录,过程应该很快,但我的第一个解决方案需要永远。是我做错了什么还是这种方法有其他问题?如果有人知道如何使此解决方案起作用或其他更好的方法,请告诉我。谢谢。
【问题讨论】:
-
如果格式正确,我会将文件 BULK INSERT 下载到临时表中。然后验证并将您需要的任何列插入到目标表中。
-
我强烈建议您也查看 BULK INSERT。我不得不创建一个临时视图以避免专门处理某些数据类型,但 VARCHAR 字段不需要任何额外的努力。批量导入以毫秒为单位处理,而不是循环时可能遇到的多秒(和潜在的超时)。我们将 CSV 文件传输到 SQL 服务器并使用 UNC 路径执行本地导入。它非常非常快,而且从来没有任何问题。
-
我最终使用了 BULK INSERT 并且非常简单,因为我只指定了文件中我需要的列。谢谢大家的帮助。
-
很高兴你能成功。由于已经有类似的答案,因此标记为 How to make batch insert with ColdFusion having more than 1000 records? 的欺骗
标签: sql-server sql-server-2008 coldfusion sql-insert cfloop