R 中的粘贴功能在构建 SQL 查询时不起作用
Paste function in R is not working in building SQL query
下面的代码是正常的 sql R 中的查询,工作正常。
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 试图通过引用您粘贴的内容来保护您免受 sql 注入。
>s1<-paste("SELECT CURRENT_DATE")
>s1
[1] "SELECT CURRENT_DATE"
>build_sql(s1)
<SQL> 'SELECT CURRENT_DATE'
注意字符串开头和结尾的单引号。这就是我们的绊脚石。
如果您希望粘贴结果中的文本被视为 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)
下面的代码是正常的 sql R 中的查询,工作正常。
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 试图通过引用您粘贴的内容来保护您免受 sql 注入。
>s1<-paste("SELECT CURRENT_DATE")
>s1
[1] "SELECT CURRENT_DATE"
>build_sql(s1)
<SQL> 'SELECT CURRENT_DATE'
注意字符串开头和结尾的单引号。这就是我们的绊脚石。
如果您希望粘贴结果中的文本被视为 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)