Прочитать файл csv / xsls и вставить в таблицу базы данных SQL 2008 с ColdFusion 2016? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть .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>

Код выше просто продолжает загружаться вечно, и я все еще не получил результаты в своей таблице.Затем я попытался сделать это:

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

Этот метод работает, но, на мой взгляд, очень неэффективен, так как я открываю новое соединение с базой данных для каждой записи, вместо этого первое решение должно быть более эффективным.В этом файле 80 тыс. Записей, и процесс должен быть быстрым, но вместо этого мое первое решение занимает вечность.Есть ли что-то, что я делаю не так или есть какие-то другие проблемы с этим методом?Если кто-нибудь знает, как заставить это решение работать или какой-то другой лучший подход, пожалуйста, дайте мне знать.Спасибо.

1 Ответ

0 голосов
/ 30 мая 2018

В вашем первом фрагменте кода пропущена запятая между итерациями.Как вы можете видеть, вы были на правильном пути в своей первоначальной попытке, как описано здесь.Тем не менее, эта статья также предупреждает о блокировке данных, переполнении буфера запросов, максимальном ограничении параметров.

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