Sql server 使用ColdFusion 2016读取csv/xsls文件并插入SQL 2008数据库表?

Sql server 使用ColdFusion 2016读取csv/xsls文件并插入SQL 2008数据库表?,sql-server,sql-server-2008,coldfusion,sql-insert,cfloop,Sql Server,Sql Server 2008,Coldfusion,Sql Insert,Cfloop,我有.csv文件,大约有80k条记录。文件大约有15列,但我只需要3列就可以插入了。首先,我使用ColdFusion cfhttp方法从服务器读取文件,然后尝试使用此技术在SQL数据库表中插入多行。下面是一个例子: <cfsetting requestTimeOut = "36000" /> <cfhttp method="get" url="https://testsite.org/ZipCodes.csv" name="zipData"> <cfquery

我有
.csv
文件,大约有80k条记录。文件大约有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>

插入ZipCodes(
齐普,
苏市,
z_州
)价值观
(
,
,
)
上面的代码一直在加载,我仍然没有在表中得到结果。然后我试着这样做:

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

插入ZipCodes(
齐普,
苏市,
z_州
)价值观
(
,
,
)

这种方法有效,但在我看来效率非常低,因为我正在为每个记录打开新的数据库连接,而第一种解决方案应该更有效。这个文件中有80k条记录,处理速度应该很快,但我的第一个解决方案需要花费很长时间。这个方法有没有什么地方我做错了,或者有其他问题?如果有人知道如何让这个解决方案工作或其他更好的方法,请让我知道。谢谢。

在您的第一个代码片段中,您缺少迭代之间的逗号。正如你所看到的,正如这里所解释的,你在最初的尝试中走在了正确的轨道上。但是,本文还警告数据锁定、查询缓冲区溢出、最大参数限制

此外,在测试时,我会将
endrow
参数添加到
中,添加到一个相对较小的数字,以查看生成的代码在语法和编程方面是否合理

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

插入ZipCodes(
齐普,
苏市,
z_州
)价值观
,
(
,
,
)

如果格式正确,我会将文件下载到临时表中。然后验证并将所需的任何列插入到目标表中。我强烈建议您也查看批量插入。为了避免专门处理某些数据类型,我不得不创建一个临时视图,但是VARCHAR字段不需要任何额外的工作。批量导入的处理时间为千秒,而循环时可能会遇到多秒(和潜在超时)。我们将CSV文件传输到SQL server,并使用UNC路径执行本地导入。它非常非常快,从来没有出现过任何问题。我最终使用了批量插入,而且非常简单,因为我只指定了文件中需要的列。谢谢大家的帮助。很高兴你们能成功。因为已经有了类似的答案,所以标记为最大参数限制的重复,对于sql server,~2100,并没有得到足够的强调。如果你不得不使用ColdFusion而不是更好的工具,那就接受它,一次插入一行。@DanBracuk似乎是迄今为止ColdFusion的唯一解决方案。非常感谢。