2015-11-11 4 views
1

Я пытаюсь вставить данные из R в таблицу SQL. С этой целью я написал следующую функцию, которая создает оператор INSERT:R: Вставка данных в существующую базу данных SQL. Случайно опуская данные?

CreateInsert <- function(Dataframe, TableName){ 
    Output=character() 

    ColumnNames="(" 
    Values=colnames(Dataframe) 
    for (i in 1:ncol(Dataframe)) { 
    ColumnNames=paste(ColumnNames, Values[i], ",",sep="") 
    } 

    ColumnNames=substr(ColumnNames, 1, nchar(ColumnNames)-1) 
    ColumnNames=paste(ColumnNames, ")",sep="") 

    TableEtc=paste("INSERT INTO", TableName, ColumnNames) 
    do.call("sprintf", c(paste(TableEtc, "VALUES ('%s', '%s', '%s', '%s', '%s', '%s');"), Dataframe)) 

} 

Впоследствии я выполнить это заявление после быстрой проверки для NA:

InsertQuery=CreateInsert(SelData, "TableName") 
    InsertQuery=gsub("'NA'", "NULL", InsertQuery) # Regular Expression 
    sqlQuery(DBconn, paste(InsertQuery, sep="", collapse="")) 

Однако случайно опускает строку. Например, я храню корреляционную матрицу (расплавленную в длинную матрицу). Я на 100% уверен, что данные завершены, но при их хранении и случайном опросе результатов некоторые моменты отсутствуют. Любая идея, почему это происходит? Чем больше количество строк вставки, тем вероятнее это происходит. Хотя ударить даже бывает, когда я вставляю одну строку тысячи раз (цикл).

FYI: Я также попытался использовать sqlSave

sqlSave(DBconn, SelData, tablename='TABLENAME', append=TRUE, rownames=FALSE, safer=TRUE) 

Но это просто дает мне ошибку «не удалось добавить в таблицу» и я менее склонен использовать его, поскольку он может также создать таблицу, если один случайно ошибается. Создание таблиц, которые я не хотел бы выполнять пользователем в R.

Спасибо!

+0

попробуйте использовать 'verbose = TRUE' с sqlSave –

+0

Спасибо! Это действительно объясняет sqlSave: невозможно вставить явное значение для столбца идентификатора в таблице «CorrelationTable», если для параметра IDENTITY_INSERT установлено значение OFF. Проблема с полем auto_increment, из которых я прочитал ответы, может быть заполнена NA (которая тогда будет пропущена), что я сделал, но, видимо, это не сработало! – Shakes

ответ

0

Пока это сводило меня с ума весь день ... Думаю, я нашел решение. Проблема, похоже, связана с научной нотацией. Поэтому я использую:

options(scipen=999) 

(Установка в 0 будет положить его обратно по умолчанию)

Извиняюсь!

 Смежные вопросы

  • Нет связанных вопросов^_^