长字符串的参数化查询

时间:2019-07-25 11:28:30

标签: sql r-dbi exasolution

我有一个要从Exasol数据库上的(本地)R执行的参数化SQL查询,如下所述: https://db.rstudio.com/best-practices/run-queries-safely/#parameterized-queries

with tab as 
   (select 
      t.*, 
      position(value in ?) as pos
      from MY_TABLE t
   )
select * from tab where pos > 0;

传递给?的值是一个(长)字符串。如果此字符串的长度为2000个字符或更少,则一切正常。当我将其增加到2001个字符时,出现错误:

Error in result_bind(res@ptr, as.list(params)) : 
nanodbc/nanodbc.cpp:1587: 40001: [EXASOL][EXASolution driver]GlobalTransactionRollback 
msg: data exception - string data, right truncation. (Session: 1640027176042911503) 

我想问题的出处是我的参数被识别为CHAR而不是VARCHAR。 Exasol用户手册指出: “这两种类型的长度分别限制为2,000个字符(CHAR)和2,000,000个字符(VARCHAR)。”

有什么方法可以将?强制转换为VARCHAR

2 个答案:

答案 0 :(得分:1)

如果您通过ODBC建立数据库连接,则可以尝试查看以下参数:
MAXPARAMSIZEDEFAULTPARAMSIZE

如果在odbc配置中将DEFAULTPARAMSIZE设置为更高的值,可能是这样:
https://docs.exasol.com/connect_exasol/drivers/odbc/using_odbc.htm?Highlight=varchar

答案 1 :(得分:0)

当我尝试使用第一种建议的方法来运行参数化查询时出现了上述问题,该方法在以下教程中进行了介绍:https://db.rstudio.com/best-practices/run-queries-safely/。第一种方法使用功能dbSendQuery()dbBind()的组合。

当我切换到使用sqlInterpolate()函数的第二种(不太安全)方法时,长字符串的问题已解决。