【问题标题】:Read csv/xsls file and insert in SQL 2008 database table with ColdFusion 2016?使用 ColdFusion 2016 读取 csv/xsls 文件并插入 SQL 2008 数据库表?
【发布时间】: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


【解决方案1】:

在您的第一个代码 sn-p 中,您缺少迭代之间的逗号。如您所见,您在最初的尝试中走在正确的轨道上,如此处所述。但是,这篇文章也警告了数据锁定、查询缓冲区溢出、最大参数限制。

https://coldfusion.adobe.com/2017/11/bulk-inserting-data/

另外,在测试时,我会将endrow 参数添加到您的&lt;cfloop&gt; 到一个相对较小的数字,以查看生成的代码在语法和编程上是否合理。

<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>

【讨论】:

  • sql server 的最大参数限制,~2100,没有得到足够的强调。如果您必须使用 ColdFusion 而不是更好的工具,那就把它收起来,一次插入一行。
  • @DanBracuk 似乎这是迄今为止 ColdFusion 的唯一解决方案。谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 1970-01-01
  • 2019-01-09
  • 2019-05-15
  • 2015-12-26
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
相关资源
最近更新 更多