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 查询时不起作用的主要内容,如果未能解决你的问题,请参考以下文章
Flutter:Getx Controller中的异步函数在初始化时不起作用
jquery datatables 按钮:['excel'] 在 document.ready() 中构建表格时不起作用,但在动态构建表格时起作用