2013-01-15 18 views
17

Sto cercando di caricare un dataframe a una tabella di SQL Server, ho provato a rompere verso il basso per una semplice stringa di query SQL ..Come inserire un dataframe in una tabella di SQL Server?

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) 

..che sembra funzionare, ma non scala molto bene. C'è un modo più semplice?

+1

Se la tabella esiste, "append" deve essere VERO o utilizzare sqlUpdate. Se non esiste sarei rimasto con il valore predefinito (FALSE) in sqlSave. Ho letto che ci sono strane convenzioni di denominazione per SQL Server, ma non ho una copia così in grado di testare. –

risposta

18

[a cura] Forse incollando il names(df) risolverebbe il problema di scala:

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

Tu dici il codice è "lavorando" .. Vorrei anche pensato si potrebbe usare sqlSave piuttosto che sqlquery se si volesse "caricare".

avrei indovinato questo sarebbe più probabile che a fare quello che hai descritto:

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

Non sei sicuro di cosa stai cercando di fare con la variabile 'values', che crea solo una stringa dall'aspetto strano ?! Hai ragione riguardo alla virgola finale, sarebbe un problema. Le "virgolette" sono lasciate dal mio codice originale. – jenswirf

+0

Questo doveva solo illustrare che 'names (df)' e "[" potevano essere usati per accedere a un data.frame da colonne in modo più astratto di quello che stavi facendo. Avrebbe bisogno di un "collasso =" "o" collapse = "," per essere efficace. –

5

Dal insert INTO è limitata a 1000 righe, è possibile dbBulkCopy da rsqlserver pacchetto.

dbBulkCopy è un'estensione DBI che interfaccia l'utilità di riga di comando più popolare di Microsoft SQL Server denominata bcp per eseguire rapidamente il bulk di file di grandi dimensioni nella tabella. Ad esempio:

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) 
+0

Non riesco a far funzionare dbBulkCopy ... produce uno strano errore come questo ... Errore in clrCallStatic ("rsqlserver.net.misc", ... e continua ... Tipo: System.Data.SqlClient.SqlException ... Non so nemmeno se si tratta di errore dbBulkCopy o errore del pacchetto rClr ... Hai idea di cosa potrebbe essere? –

+0

@ MihaTrošt Sei riuscito a lavorare con altre funzioni di 'rsqlserver''? Meglio creare un problema in [problema rsqlserver] (/ problemi), lo guarderò da vicino – agstudy

+1

Posso lavorare con altre funzioni e anche, seguendo questo argomento http://stackoverflow.com/questions/19190744/how-to-quickly- export-data-da-r-to-sql-server, penso che non sia il problema di dbBulkCopy ... prima, non avevo permessi di inserimento in blocco (ho ora), in secondo luogo, il file che ho provato a dbBulkCopy non era sulla macchina in cui è installato SQL Server e non è stato in grado di trovarlo. Quindi ... per ora, per favore, non importa i miei commenti e grazie per il vostro tempo –

0

Questo ha funzionato per me e ho trovato che fosse più semplice.

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 
+0

dbWriteTable è molto più veloce di RODBC :: sqlSave – mateskabe

Problemi correlati