Подтвердить что ты не робот

Как вставить данные в таблицу SQL Server?

Я пытаюсь загрузить фрейм данных в таблицу SQL Server, я попытался разбить его на простую строку запроса SQL.

library(RODBC)
con <- odbcDriverConnect("driver=SQL Server; server=database")

df <- data.frame(a=1:10, b=10:1, c=11:20)

values <- paste("(",df$a,",", df$b,",",df$c,")", sep="", collapse=",")

cmd <- paste("insert into MyTable values ", values)

result <- sqlQuery(con, cmd, as.is=TRUE)

.. который, похоже, работает, но не очень хорошо масштабируется. Есть ли более простой способ?

4b9b3361

Ответ 1

[edit] Возможно, вставка names(df) решит проблему масштабирования:

   values <- paste( " df[  , c(", 
                     paste( names(df),collapse=",") ,
                                   ")] ", collapse="" ) 
      values
      #[1] " df[  , c( a,b,c )] "

Вы говорите, что ваш код "работает". Я бы также подумал, что использовать sqlSave вместо sqlQuery, если захочет "загрузить".

Я бы предположил, что с большей вероятностью будет делать то, что вы описали:

 sqlSave(con, df, tablename = "MyTable")

Ответ 2

Так как insert INTO ограничено 1000 строками, вы можете dbBulkCopy из rsqlserver.

dbBulkCopy - это расширение DBI, которое взаимодействует с популярной утилитой командной строки Microsoft SQL Server с именем bcp для быстрого массового копирования больших файлов в таблицу, Например:

url = "Server=localhost;Database=TEST_RSQLSERVER;Trusted_Connection=True;"
conn <- dbConnect('SqlServer',url=url)
## I assume the table already exist
dbBulkCopy(conn,name='T_BULKCOPY',value=df,overwrite=TRUE)
dbDisconnect(conn)

Ответ 3

Это сработало для меня, и я нашел, что это проще.

library(sqldf)
library(odbc)
con <- dbConnect(odbc(),
                 Driver = "SQL Server",
                 Server = "ServerName",
                 Database = "DBName",
                 UID = "UserName",
                 PWD = "Password")
dbWriteTable(conn = con, 
             name = "TableName", 
             value = x)  ## x is any data frame