使用变量约束的 sqlQuery 不起作用。

Posted

技术标签:

【中文标题】使用变量约束的 sqlQuery 不起作用。【英文标题】:sqlQuery using a variable constraint not working. 【发布时间】:2016-08-24 12:57:32 【问题描述】:

我正在尝试使用 R 中的 RODBC 包将查询传递给 Access。我可以使用 sqlFetch 导入整个表,但我希望使用查询来挑选数据。

但是,我想使用 R 变量来选择约束之一(Shaft_ID)。

为了构造 SQL 查询,我使用了 Cat 和 Paste,因此我可以在 Shaft 变量周围使用引号。

我的代码如下:

    Shaft<- "S001"
BL <- sqlQuery(myDBcon, paste("SELECT * FROM BL_FGSL WHERE Shaft_ID ='",Shaft,"'"), error = TRUE, as.is = TRUE)

这会创建一个数据框,但它没有找到任何值。如果我直接用“S001”替换变量,它就可以工作!

有什么想法吗?

【问题讨论】:

我认为你不应该在那里使用cat。省略它。 cat 仅用于写入STDOUT(或文件)的副作用;它返回 NULL 而不是打印的文本 -- is.null(cat(1:5, "\n")) 您什么都不返回的原因是您查询正在寻找' S001 '(两边都有空格),因为您使用了paste()而没有指定分隔符:使用paste(&lt;SQL string&gt;, sep="")paste0(&lt;SQL String&gt;) 完美,感谢 Partait。 【参考方案1】:

SQL 使用单引号字符',但在 SQL 注入中匹配引号可能会令人讨厌,因此不强烈推荐。

我建议将您的查询参数化,并让计算机为您管理报价。

library(RODBC)
library(RODBCext)

Shaft<- "S001"

BL <- 
  sqlExecute(myDBcon, 
             query = "SELECT * FROM BL_FGSL WHERE Valid = TRUE AND Shaft_ID = ?", 
             data = list(Shaft_ID = Shaft),
             fetch = TRUE, 
             stringsAsFactors = FALSE,
             error = TRUE)

https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html

【讨论】:

感谢本杰明,让我知道 RODBCext 存在!我尝试了代码,但出现以下错误:- sqlExecute 中的错误(myDBcon,查询 =“SELECT * FROM BL_FGSL WHERE Valid = TRUE AND Shaft_ID = ?”,:HY104 98 [Microsoft][ODBC Microsoft Access Driver]Invalid精度值 [RODBCext] 错误:SQLBindParameter failed 另外:警告消息:HY104 98 [Microsoft][ODBC Microsoft Access Driver]无效的精度值 这是匹配数据类型的问题吗? 好像是这样。 Shaft_ID 的数据类型是什么? 这可能是相关的...social.msdn.microsoft.com/Forums/en-US/… Shaft_ID 具有短文本数据类型。

以上是关于使用变量约束的 sqlQuery 不起作用。的主要内容,如果未能解决你的问题,请参考以下文章

为啥这些约束不起作用?

自动布局约束不起作用

Hibernate Validator 自定义约束不起作用

ImageView 的约束不起作用

图像高度约束不起作用

为啥这个按钮约束设计不起作用?