Stiamo utilizzando questa funzione per inserire tabelle di massa. Utilizza il pacchetto RODBC e la sua connessione.
dbhandle <- odbcDriverConnect('driver={SQL Server};server=server...')
sqlInsertBulk <- function(data, table, dbhandle,chunksize = 1000)
{
stopifnot(chunksize <= 1000)
nrow_initial<-sqlQuery(dbhandle,paste("SELECT COUNT (1) FROM ",table))
#If data includes Inf value, stop function.
numericCols <- names(data)[sapply(data, is.numeric)]
if (length(numericCols != 0)) {
if(sum(unlist(data[,lapply(.SD, function(x) any(x == Inf)),.SDcols = numericCols]),na.rm=T)>0){
stop("Data includes Inf value.")
}
}
chunknumber <- ceiling(nrow(data)/chunksize)
qstart <- paste("INSERT INTO ", table ," (",paste(colnames(data),collapse = ", "), ") VALUES")
for(chunki in 1:chunknumber)
{
chunkstart <- 1 + chunksize * (chunki - 1)
chunkend <- min(nrow(data), chunki * chunksize)
chunkdata <- data[chunkstart:chunkend]
valuestring <- vector(mode="character", length=chunkend - chunkstart + 1)
for(i in 1:nrow(chunkdata)){
valuestring[i] <- paste("(", paste(sapply(chunkdata[i], function(input){
if(!class(input) %in% c("numeric", "integer")) {
input<-paste0("'", input, "'")
}
if(is.na(input))
{
input<-"NULL"
}
return (input)
}), collapse=", "), ")")
}
qend <- paste(valuestring, collapse = ", ")
q <- paste(qstart, qend)
print(paste("Chunk", chunki, "is in process."))
sqlQuery(dbhandle,q)
print(paste("Chunk", chunki, "is uploaded."))
}
nrow_final <- sqlQuery(dbhandle,paste("SELECT COUNT (1) FROM ",table))
if(nrow_final-nrow_initial==nrow(data)) {
print(paste("All ",nrow(data)," data is uploaded."))
} else {
print(paste0("Warning!!! Only ",nrow_final-nrow_initial, " out of ",nrow(data), " are uploded."))
}
}
Nah, sqlSave farà più INSERTI. Voglio un BULK INSERT che è una singola transazione. – ephpostfacto
fa fast = true non lo fa come una singola transazione? – Tyler
da rodbc docs: "logico, se falso, scrivere i dati una riga alla volta, se è vero, utilizzare una query INSERT INTO o UPDATE parametrizzata per scrivere tutti i dati in un'unica operazione." .. tuttavia non sembra fare qualche differenza (quando si scrive a Netezza nel mio caso) – Joe