Групповой импорт SQL от CSV

Обновление

Быстрее, чем .cloneNode() и .replaceChild()

Диапазон API

] На 5% быстрее, чем ВСЕ примеры
(включая принятый ответ)

Следующий пример взят из Range API :

const rng = document.createRange();
rng.selectNodeContents(document.querySelector('ul'));
rng.deleteContents();
blockquote>

интерфейс Range работает с фрагментами документа, состоящими из узлов и текста. Хотя он выглядит медленным , на самом деле он быстрый и на 100% совместим со всеми браузерами .

Range Range

.createRange()
[1152] .selectNodeContents()
.deleteContents()

blockquote>

.replaceWith() и .createElement()

на 15% медленнее, чем все примеры
Это комбо быстрее большинства примеров и менее многословно (за исключением диапазона демонстрация - самая быстрая.)

 document.querySelector('ul').replaceWith(document.createElement('ul'));
blockquote>

Это 2 взаимодействия DOM: найдите список и замените его пустым списком. См. Демонстрацию 1. Если вы хотите поддерживать IE11 (глобальная доля ATM 2,26%) , не используйте его.


Демонстрация 1

API диапазона

const rng = document.createRange();
rng.selectNodeContents(document.querySelector('ul'));
rng.deleteContents();
ul {
  min-height: 30px;
  min-width: 30px;
  outline: 1px dashed red;
}
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM

[ 1166] Демонстрация 2

.replaceWith() и .createElement()

document.querySelector('ul').replaceWith(document.createElement('ul'));
ul {
  min-height: 30px;
  min-width: 30px;
  outline: 1px dashed red;
}
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM
  • ITEM

.insertAdjacentHTML() и amp; .createDocumentFragment()

@ 50% медленнее, чем все примеры
Лучший способ оптимизировать любые манипуляции с DOM - не иметь их. Держите доступ DOM к минимуму - это очень много времени. Каждый раз, когда механизм JS ищет элемент, он будет проходить по дереву DOM, каждый раз, когда тег добавляется или удаляется, узлы (элемент, текст и т. Д.), Которые уже находятся в DOM, должны пересчитываться для определения местоположения и размеров, чтобы даже если количество задействованных узлов всего несколько, это может привести к исключительно длительному процессу для браузера. Это называется reflow, и похожая проблема, связанная со стилями CSS, называется перерисовкой.


Следующая демонстрация удаляет все
  • в
      с 4 операциями DOM:
      1. Ссылается на поиск

          - 1

          ]
        • Ссылочный родительский элемент

            добавляет пустой
              - 1 поиск, 1 добавление

            • Создайте documentFragment и добавьте оригинал [ 1128] к нему - 1 удаление

      blockquote>

      .insertAdjacentHTML() без деструктивного рендеринга htmlString в HTML и он очень оптимизирован .

      .createDocumentFragment() никогда не касается DOM и все, что к нему прикреплено, больше не касается DOM.


      Демонстрация 3

      .insertAdjacentHTML и .createDocumentFragment()

      // Reference the 
        const list = document.querySelector('ul'); // Reference parent of
          append an empty
            list.parentElement.insertAdjacentHTML('beforeend', `
              `); // Create a document fragment and append original
                to it document.createDocumentFragment().appendChild(list);
        ul {
          min-height: 30px;
          min-width: 30px;
          outline: 1px dashed red;
        }
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        • ITEM
        ]
    • 23
      задан Radu094 18 September 2008 в 20:39
      поделиться

      14 ответов

      Я знаю, что это не действительное решение, но я использую фиктивную таблицу для импорта с набором nvarchar для всего. Тогда я делаю вставку, которая разделяет "символы и делает преобразования. Это не симпатично, но это делает задание.

      3
      ответ дан 29 November 2019 в 02:22
      поделиться

      Это старый вопрос, поэтому я пишу его, чтобы помочь любому, кто наткнется на него.

      SQL Server 2017 вводит параметр FIELDQUOTE, который предназначен для этого конкретного случая использования.

      0
      ответ дан 29 November 2019 в 02:22
      поделиться

      Если Вы выясняете, как проанализировать файл в DataTable, я предложил бы класс SqlBulkInsert для вставки его в SQL Server.

      0
      ответ дан 29 November 2019 в 02:22
      поделиться

      У вас есть контроль над форматом ввода? | (трубы), и \ t обычно делают для лучших терминаторов поля.

      0
      ответ дан 29 November 2019 в 02:22
      поделиться

      Вы могли также использовать DTS или SSIS.

      0
      ответ дан 29 November 2019 в 02:22
      поделиться

      Да, K Richard является правильным: FIELDTERMINATOR = '","'

      См. http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file для большего количества информации

      0
      ответ дан 29 November 2019 в 02:22
      поделиться

      u может попробовать этот код, который очень сладок, если Вы захотите, это удалит нежелательные точки с запятой из Вашего кода. если, например, Ваши данные похожи на это:
      "Kelly", "Reynold", "kelly@reynold.com"

      Bulk insert test1
      from 'c:\1.txt' with ( 
          fieldterminator ='","'
          ,rowterminator='\n')
      
      update test1<br>
      set name =Substring (name , 2,len(name))
      where name like **' "% '**
      
      update test1
      set email=substring(email, 1,len(email)-1)
      where email like **' %" '**
      
      1
      ответ дан 29 November 2019 в 02:22
      поделиться

      Во-первых, вам нужно импортировать файл CSV в таблицу данных

      Затем вы можете вставить объемные строки с помощью SQLBulkCopy

      using System;
      using System.Data;
      using System.Data.SqlClient;
      
      namespace SqlBulkInsertExample
      {
          class Program
          {
            static void Main(string[] args)
              {
                  DataTable prodSalesData = new DataTable("ProductSalesData");
      
                  // Create Column 1: SaleDate
                  DataColumn dateColumn = new DataColumn();
                  dateColumn.DataType = Type.GetType("System.DateTime");
                  dateColumn.ColumnName = "SaleDate";
      
                  // Create Column 2: ProductName
                  DataColumn productNameColumn = new DataColumn();
                  productNameColumn.ColumnName = "ProductName";
      
                  // Create Column 3: TotalSales
                  DataColumn totalSalesColumn = new DataColumn();
                  totalSalesColumn.DataType = Type.GetType("System.Int32");
                  totalSalesColumn.ColumnName = "TotalSales";
      
                  // Add the columns to the ProductSalesData DataTable
                  prodSalesData.Columns.Add(dateColumn);
                  prodSalesData.Columns.Add(productNameColumn);
                  prodSalesData.Columns.Add(totalSalesColumn);
      
                  // Let's populate the datatable with our stats.
                  // You can add as many rows as you want here!
      
                  // Create a new row
                  DataRow dailyProductSalesRow = prodSalesData.NewRow();
                  dailyProductSalesRow["SaleDate"] = DateTime.Now.Date;
                  dailyProductSalesRow["ProductName"] = "Nike";
                  dailyProductSalesRow["TotalSales"] = 10;
      
                  // Add the row to the ProductSalesData DataTable
                  prodSalesData.Rows.Add(dailyProductSalesRow);
      
                  // Copy the DataTable to SQL Server using SqlBulkCopy
                  using (SqlConnection dbConnection = new SqlConnection("Data Source=ProductHost;Initial Catalog=dbProduct;Integrated Security=SSPI;Connection Timeout=60;Min Pool Size=2;Max Pool Size=20;"))
                  {
                      dbConnection.Open();
                      using (SqlBulkCopy s = new SqlBulkCopy(dbConnection))
                      {
                          s.DestinationTableName = prodSalesData.TableName;
      
                          foreach (var column in prodSalesData.Columns)
                              s.ColumnMappings.Add(column.ToString(), column.ToString());
      
                          s.WriteToServer(prodSalesData);
                      }
                  }
              }
          }
      }
      
      1
      ответ дан 29 November 2019 в 02:22
      поделиться

      Необходимо ли сделать это программно, или действительно ли это - одноразовый выстрел?

      Используя Руководителя предприятия, щелкните правой кнопкой по Import Data, позволяет Вам выбрать свой разделитель.

      1
      ответ дан 29 November 2019 в 02:22
      поделиться

      Я бы сказал, использовать FileHelpers - это библиотека с открытым исходным кодом.

      2
      ответ дан 29 November 2019 в 02:22
      поделиться

      Попробуйте OpenRowSet. Это может использоваться для импорта материала Excel. Excel может открыть файлы CSV, таким образом, только необходимо выяснить корректный [ConnectionString][2].

      [2]: Драйвер = {текстовый Драйвер Microsoft (*.txt; *.csv)}; Dbq=c:\txtFilesFolder\; Extensions=asc, csv, вкладка, txt;

      4
      ответ дан 29 November 2019 в 02:22
      поделиться

      Еще один хак, который я иногда использую, - это открыть CSV в Excel, а затем записать свой SQL-оператор в ячейку в конце каждой строки. Например:

      =concatenate("insert into myTable (columnA,columnB) values ('",a1,"','",b1,"'")")
      

      Заполнение может заполнить это в каждой строке для вас. Затем просто скопируйте и вставьте вывод в новое окно запроса.

      Это старая школа, но если вам нужно делать импорт время от времени, это избавит вас от необходимости возиться с чтением всей непонятной документации о «правильном» способе сделать это.

      9
      ответ дан 29 November 2019 в 02:22
      поделиться

      Попробуйте FIELDTERMINATOR='","'

      , Вот большая ссылка, чтобы помочь с первой и последней кавычкой... посмотреть, как он использовал подстроку SP

      http://www.sqlteam.com/article/using-bulk-insert-to-load-a-text-file

      13
      ответ дан 29 November 2019 в 02:22
      поделиться

      Необходимо предостеречься с BCP/BULK INSERT, потому что никакой BSP или Объемная Вставка не обрабатывают это хорошо, если заключение в кавычки не последовательно, даже с файлами формата (даже файлы формата XML не предлагают опции), и макет ["] символы вначале, и закончите и использующий [""] как разделитель. Технически файлы CSV не должны иметь ["] символов, если существует не встроено [] символы

      Именно по этой причине, файлы разделенных запятыми значений иногда упоминаются как ограниченные комедией файлы.

      OpenRowset потребует Excel на сервере и мог быть проблематичным в 64-разрядных средах - я знаю, что это - проблематичное использование Excel в Струе в 64-разрядном.

      SSIS является действительно Вашим лучшим выбором, если файл, вероятно, будет варьироваться от Ваших ожиданий по будущему.

      1
      ответ дан 29 November 2019 в 02:22
      поделиться
      Другие вопросы по тегам:

      Похожие вопросы: