23

我正在尝试将数据框上传到 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)

..这似乎工作但不能很好地扩展。有没有更简单的方法?

4

3 回答 3

21

[编辑]也许粘贴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")
于 2013-01-15T11:20:17.200 回答
7

这对我有用,我发现它更简单。

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
于 2017-12-05T07:46:40.270 回答
6

由于insert INTO限制为 1000 行,您可以dbBulkCopyrsqlserver包中。

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)
于 2013-11-21T11:48:15.757 回答