Массовая вставка MS-SQL с помощью RODBC - PullRequest
7 голосов
/ 10 сентября 2009

Возможно ли выполнить массовую вставку в MS-SQL Server (2000, 2005, 2008) с использованием пакета RODBC?

Я знаю, что могу сделать это с помощью freebcp, но мне любопытно, реализует ли пакет RODBC эту часть Microsoft SQL API, а если нет, то насколько сложно будет это реализовать.

Ответы [ 6 ]

4 голосов
/ 27 февраля 2017

ознакомьтесь с новыми пакетами odbc и DBI. DBI::dbWriteTable записывает около 20 000 записей в секунду ... Гораздо быстрее, чем Row Inserts из RODBC::sqlSave()

2 голосов
/ 11 ноября 2013

Теперь вы можете использовать dbBulkCopy из нового rsqlserver пакета:

Типичный сценарий:

  1. Вы создаете матрицу
  2. Вы сохраняете его как CSV-файл
  3. Вы вызываете dbBulkCopy, чтобы прочитать файл и вставить его с помощью внутреннего bcp инструмента сервера MS Sql.

Предполагается, что ваша таблица уже создана в базе данных:

dat <- matrix(round(rnorm(nrow*ncol),nrow,ncol)
id.file = "temp_file.csv"                      
write.csv(dat,file=id.file,row.names=FALSE)
dbBulkCopy(conn,'NEW_BP_TABLE',value=id.file)
2 голосов
/ 30 сентября 2009

Вы, вероятно, ищете ?sqlSave, который использует параметризованный запрос INSERT INTO (выполняемый за одну операцию) при установке Fast=True.

1 голос
/ 10 марта 2018

Используя RODBC, самая быстрая вставка, которую мы смогли создать (260 миллионов вставок строк), выглядит следующим образом (в псевдокоде R):

ourDataFrame <- sqlQuery(OurConnection, "SELECT myDataThing1, myDataThing2
                                         FROM myData")
ourDF <- doStuff(ourDataFrame)
write.csv(ourDF,ourFile)  
sqlQuery(OurConnection, "CREATE TABLE myTable ( la [La], laLa [LaLa]);
                         BULK INSERT myTable FROM 'ourFile' 
                              WITH YOURPARAMS=yourParams;")

Если вы запускаете это между серверами, вам нужен сетевой диск, на который R-сервер может записывать (например, один сервер с разрешениями на запись в БД использует Rscript для производственного кода), и SQL Server может читать с.

1 голос
/ 21 апреля 2016

Наш пакет n2khelper может использовать bcp (массовая копия), когда он доступен. Когда он недоступен, он использует несколько операторов INSERT.

Вы можете найти пакет на https://github.com/INBO-Natura2000/n2khelper

Установите его с помощью devtools::install_git("INBO-Natura2000/n2khelper") и найдите функцию odbc_insert().

1 голос
/ 19 августа 2015

Из всего, что я могу найти, НЕТ решения для массовой вставки в MySQL и ничего, что работает с SSIS, поэтому Microsoft включает аналитику в базе данных с SQL Server 2016 после покупки Revolution R Analytics.

Я пытался прокомментировать предыдущий ответ, но у меня нет репутации, чтобы это сделать.

Пакет rsqlserver должен работать с rClr, и ни один из этих пакетов не работает должным образом, тем более что функции INSERT rsqlserver плохо обрабатывают типы данных. Поэтому, если вы используете его, вы не будете знать, на что обращаете внимание в таблице SQL, так как большая часть информации в вашем data.frame будет преобразована.

Учитывая, что пакет RODBC существует уже 15 лет, я очень разочарован тем, что никто не создал функцию массовой вставки ...

...