R 中的粘贴函数在构建 SQL 查询时不起作用

Posted

技术标签:

【中文标题】R 中的粘贴函数在构建 SQL 查询时不起作用【英文标题】:Paste function in R is not working in building SQL query 【发布时间】:2017-05-02 18:21:44 【问题描述】:

以下代码是 R 中的正常 sql 查询,运行良好。

s1 <- build_sql(" INSERT INTO DB_PUBLIC_ANNEX.JS06290.IPQ_TEST(PIN,WRNTY_CLM_SEQ_NUM) VALUES (123,456)")
TABLE <- sqlQuery(connection_string, s1)

但是当我使用下面的粘贴功能进行相同的查询时,值并没有插入到数据库中。

s1 <- build_sql(paste("INSERT INTO DB_PUBLIC_ANNEX.JS06290.IPQ_TEST(PIN,WRNTY_CLM_SEQ_NUM) VALUES (",123,",",456,")"))
TABLE <- sqlQuery(connection_string, s1)

以下是错误:

[1] "42000 27 Syntax error or access violation"                                                                                          
[2] "[RODBC] ERROR: Could not SQLExecDirect ''INSERT INTO DB_PUBLIC_ANNEX.JS06290.IPQ_TEST(PIN,WRNTY_CLM_SEQ_NUM) VALUES ( 123 , 456 )''"

【问题讨论】:

我不知道build_sql 功能,但您可以尝试使用paste0 而不是paste 【参考方案1】:

在这种情况下,build_sql 试图通过引用粘贴内容来保护您免受 sql 注入。

>s1<-paste("SELECT CURRENT_DATE")
>s1
[1] "SELECT CURRENT_DATE"

>build_sql(s1)
<SQL> 'SELECT CURRENT_DATE'

注意字符串开头和结尾处的 sinqle 引号。这就是我们的绊脚石。

如果你想让粘贴结果中的文本被视为sql,你可以像这样将它包含在sql()中,但我不推荐它。

>build_sql(sql(s1))
<SQL> SELECT CURRENT_DATE

所以如果我们像这样构建 q1,我们会得到一个错误。这里我使用的是RJDBC,但根本问题是一样的。

>col1=as.integer(123)
>col2=as.integer(456)
>q1=build_sql(paste("INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES (",col1,",",col2,")"))
>q1
<SQL> 'INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES ( 123 , 456 )'
>dbSendUpdate(con, q1)
Error in .local(conn, statement, ...) : 
  execute JDBC update query failed in dbSendUpdate (ERROR:  ''INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES ( 123 , 456 )''
error                                                              ^ found "'" (at char 59) expecting a keyword
)

我们在这里并不严格需要粘贴,如果我们想使用 build_sql,它实际上会有点妨碍我们。

>q1=build_sql("INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES (",col1,",",col2,")")
>q1
<SQL> INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES (123,456)
>dbSendUpdate(con, q1)

您可以这样做,但它会破坏 build_sql 提供的有限 sql 注入保护。

>q1=build_sql(sql(paste("INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES (",col1,",",col2,")")))
>q1
<SQL> INSERT INTO TEST_TABLE (COL1 ,COL2 ) VALUES ( 123 , 456 )
>dbSendUpdate(con, q1)

【讨论】:

非常感谢 Scott 的宝贵时间和回复。您的建议适用于这种情况:) 我很高兴!如果它对您有用,请将答案标记为解决方案,以便其他人也能找到它。 能否请您添加库,其中包括build_sql。将使其更易于将来参考并节省一些搜索。 @hannes101 它是 dplyr 包 IIRC 的一部分。 刚找到,不过是dbplyr,继承了dplyr的DB相关的东西。谢谢

以上是关于R 中的粘贴函数在构建 SQL 查询时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Excel SQL 查询中的 DateAdd 函数不起作用

Flutter:Getx Controller中的异步函数在初始化时不起作用

Access 2010 SQL - 更新查询不起作用

jquery datatables 按钮:['excel'] 在 document.ready() 中构建表格时不起作用,但在动态构建表格时起作用

引导媒体查询在 576 像素时不起作用

为啥我的函数在调用时不起作用? [关闭]