将R变量传递给RODBC的sqlQuery并带有多个条目?

时间:2011-11-14 20:34:51

标签: r

我正在学习R,挥手告别SAS,我还是新手,我不知道找不到我正在寻找的东西。

但对于这个具体案例,我读到: Pass R variable to RODBC's sqlQuery? 只要我只在目的地表中插入一个变量,它就能让我自己工作。

这是我的代码:

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 个答案:

答案 0 :(得分:2)

查看collapse文档中的paste()参数。尝试将b替换为paste(b, collapse = ", "),如下所示。

编辑正如Joshua指出的那样,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 = "")

答案 1 :(得分:2)

假设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,而不是向量。如您所知,在data.frame(或任何列表)上使用paste可能会提供奇怪的结果,因为paste必须返回一个字符向量。