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

3
我正在学习R语言,想要告别SAS,但我还是个新手,有时候很难找到我需要的内容。
针对这种情况,我阅读了以下文章:如何将R变量传递给RODBC的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))'"

我明白这是因为当我使用命令 paste(b) 时,会生成多余的 c,我猜测它代表列。

那么,我该如何获得 "8535735, 8449336" 而不是 "c(8535735, 8449336)" 呢?还是有其他方法吗?

2个回答

3

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

编辑 正如 Joshua 指出的那样,sqlQuery 返回的是一个数据框而不是向量。因此,你可以使用 paste(b[[1]], collapse = ", ") 替代 paste(b, 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 = "")

仅供参考,这里有一个稍微详细一些的版本,因为我不知道折叠参数(回答得太晚了):Reduce(function(u, v) paste(u, ", ", v, sep=""), b) - ROLO
添加了[[1]],现在它运行得很好!c( ) 已经消失了! - Felixthecat

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而不是向量。正如你所学到的,对于数据框(或任何列表),使用paste可能会提供奇怪的结果,因为paste必须返回一个字符向量。


我仍然遇到了一个错误,这次我认为是因为我将它转换为文本并尝试将文本放回到一个浮点数的 SQL 字段中。现在我得到了以下错误:无法将类型“closure”强制转换为类型“character”的向量。 - Felixthecat
@Felixthecat:我怀疑这不是原因,因为即使b$Noinscr是数字或整数向量,paste也会将其转换为字符向量。最可能的错误是您试图将函数转换为字符向量。请仔细检查您的语法。 - Joshua Ulrich
@Felixthecat:为了排除故障,您能在您的问题中发布 print(b) 的输出吗? - jthetzel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接