2

我有一个参数化的 SQL 查询,我想从 Exasol 数据库上的(本地)R 执行,如下所述: 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

4

2 回答 2

1

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

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

于 2019-09-12T10:03:05.800 回答
0

当我尝试使用第一个建议的方法来运行此处教程中描述的参数化查询时,出现了上述问题:https ://db.rstudio.com/best-practices/run-queries-safely/ 。第一种方法使用函数dbSendQuery()dbBind().

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

于 2019-09-13T12:02:50.117 回答