我有一个包含大约80k条记录的.csv
文件。文件大约有15列,但我插入时只需要3列。首先,我使用SQL方法从我的服务器读取文件,然后尝试使用该技术在ColdFusion数据库表中插入多行。下面是一个例子:
<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条记录,处理速度应该很快,但我的第一个解决方案却要花费很长时间。是我做错了什么,还是这个方法有其他问题?如果有人知道如何让这个解决方案工作或其他更好的方法,请让我知道。谢谢。
发布于 2018-05-30 05:10:29
在您的第一个代码片段中,您缺少迭代之间的逗号。正如你所看到的,你在这里解释的最初的尝试是正确的。然而,本文也警告数据锁定、查询缓冲区溢出、最大参数限制。
https://coldfusion.adobe.com/2017/11/bulk-inserting-data/
此外,在测试时,我会将一个相对较小的endrow
参数添加到<cfloop>
中,以查看结果代码在语法和编程上是否正确。
<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">
<cfif currentRow NEQ 1>,</cfif>
(
<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>
https://stackoverflow.com/questions/50591777
复制相似问题