我有一个要从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
?
答案 0 :(得分:1)
如果您通过ODBC建立数据库连接,则可以尝试查看以下参数:
MAXPARAMSIZE
和DEFAULTPARAMSIZE
。
如果在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()
函数的第二种(不太安全)方法时,长字符串的问题已解决。