web-dev-qa-db-ja.com

データフレームを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)

..これは機能しているように見えますが、あまりうまくスケールしません。もっと簡単な方法はありますか?

18
jenswirf

[編集]おそらくnames(df)を貼り付けるとスケーリングの問題が解決するでしょう:

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

あなたはあなたのコードが「機能している」と言います。「アップロード」したいのであれば、sqlQueryではなくsqlSaveを使用することも考えました。

私はこれがあなたが説明したことをする可能性が高いと推測していました:

 sqlSave(con, df, tablename = "MyTable")
20
42-

insert INTOは1000行に制限されています。 rsqlserver パッケージからdbBulkCopyできます。

dbBulkCopyは、大規模なファイルをテーブルに一括コピーするために、 bcp という名前のMicrosoft SQL Serverの一般的なコマンドラインユーティリティとインターフェイスするDBI拡張機能です。例えば:

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)
5
agstudy

これは私のために働いたと私はそれが簡単であることがわかった。

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
2
Shreyas K