Передать переменную R в sqlQuery RODBC с несколькими записями? - PullRequest
3 голосов
/ 15 ноября 2011

Я нахожусь в процессе изучения R, чтобы махнуть SAS на прощание, я все еще новичок в этом, и у меня почему-то возникают трудности с поиском именно того, что я ищу.

Но для этого конкретного случая я читаю: Передать переменную R в sqlQuery RODBC? и заставил его работать на себя, пока я вставляю только одну переменную в таблицу назначения.

Вот мой код:

library(RODBC)
channel <- odbcConnect("test")
b <- sqlQuery(channel,
  "select top 1 Noinscr
   FROM table
   where PrixVente > 100
   order by datevente desc")

sqlQuery(channel,
   paste("insert into TestTable (UniqueID) Values (",b,")", sep = "")

Когда я заменяю top 1 на любое другое число, скажем, top 2, и запускаю точно такой же код, я получаю следующие ошибки:

[1] "42000 195 [Microsoft][SQL Server Native Client 10.0][SQL Server]
    'c' is not a recognized built-in function name."      
[2] "[RODBC] ERROR: Could not SQLExecDirect 
    'insert into TestTable  (UniqueID) Values (c(8535735, 8449336))'"

Я понимаю, что это потому, что генерируется дополнительный c, я предполагаю для столбца, когда даю команду: paste(b).

Так как же получить "8535735, 8449336" вместо "c(8535735, 8449336)" при использовании paste(b)? Или есть другой способ сделать это?

Ответы [ 2 ]

2 голосов
/ 15 ноября 2011

Предположим, b выглядит следующим образом:

b <- data.frame(Noinscr=c("8535735", "8449336"))

Тогда вам нужно всего лишь пару шагов:

# in case Noinscr is a factor
b$Noinscr <- as.character(b$Noinscr)
# convert the vector into a single string
# NOTE that I subset to get the vector, since b is a data.frame
B <- paste(b$Noinscr, collapse=",")
# create your query
paste("insert into TestTable (UniqueID) Values (",B,")", sep="")
# [1] "insert into TestTable (UniqueID) Values (8535735,8449336)"

Вы получили странные результаты, потому что sqlQuery возвращает data.frame, а не вектор.Как вы узнали, использование paste в data.frame (или любом другом списке) может дать странные результаты, потому что paste должен возвращать символьный вектор.

2 голосов
/ 15 ноября 2011

Просмотрите аргумент collapse в документации paste().Попробуйте заменить b на paste(b, collapse = ", "), как показано ниже.

Edit Как указывает Джошуа, sqlQuery возвращает data.frame, а не вектор.Таким образом, вместо paste(b, collapse = ", ") вы можете использовать paste(b[[1]], collapse = ", ").

library(RODBC)
channel <- odbcConnect("test")
b <- sqlQuery(channel,
  "select top 1 Noinscr
   FROM table
   where PrixVente > 100
   order by datevente desc")

sqlQuery(channel,
   ## note paste(b[[1]], collapse = ", ") in line below
   paste("insert into TestTable (UniqueID) Values (", paste(b[[1]], collapse = ", "),")", sep = "")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...