Chúng tôi đang sử dụng chức năng này để chèn bảng hàng loạt. Nó sử dụng gói RODBC và kết nối của nó.
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."))
}
}
Không, sqlSave sẽ thực hiện nhiều lần INSERTS. Tôi muốn có một INSUL BULK mà là một giao dịch duy nhất. – ephpostfacto
thực hiện nhanh = true không thực hiện như một giao dịch đơn lẻ? – Tyler
từ các tài liệu rodbc: "hợp lý. Nếu sai, ghi dữ liệu một hàng tại một thời điểm. Nếu đúng, hãy sử dụng truy vấn INSERT INTO hoặc UPDATE parametrized để ghi tất cả dữ liệu trong một thao tác." .. Tuy nhiên nó dường như không tạo ra bất kỳ sự khác biệt nào (khi viết thư cho Netezza trong trường hợp của tôi) – Joe