J'essaie de télécharger une trame de données dans une table SQL Server, j'ai essayé de la décomposer en une simple chaîne de requête 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)
..qui semble fonctionner mais qui ne s'adapte pas très bien. Existe-t-il un moyen plus simple?
[édité] Peut-être que coller la names(df)
résoudrait le problème de mise à l'échelle:
values <- paste( " df[ , c(",
paste( names(df),collapse=",") ,
")] ", collapse="" )
values
#[1] " df[ , c( a,b,c )] "
Vous dites que votre code "fonctionne". J'aurais également pensé que l'on utiliserait sqlSave plutôt que sqlQuery si l'on voulait "télécharger".
J'aurais pensé que ce serait plus susceptible de faire ce que vous avez décrit:
sqlSave(con, df, tablename = "MyTable")
Puisque insert INTO
est limité à 1000 lignes, vous pouvez dbBulkCopy
à partir du paquet rsqlserver .
dbBulkCopy
est une extension DBI qui interface l'utilitaire de ligne de commande populaire Microsoft SQL Server nommé bcp pour copier rapidement des fichiers volumineux dans un tableau. Par exemple:
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)
Cela a fonctionné pour moi et je l'ai trouvé plus simple.
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