首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用长字符串的参数化查询

使用长字符串的参数化查询
EN

Stack Overflow用户
提问于 2019-07-25 19:28:31
回答 2查看 242关注 0票数 2

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

代码语言:javascript
复制
with tab as 
   (select 
      t.*, 
      position(value in ?) as pos
      from MY_TABLE t
   )
select * from tab where pos > 0;

传递给?的值是一个(长)字符串。当这个字符串的长度不超过2000个字符时,一切工作正常。当我将其增加到2001个字符时,我得到一个错误:

代码语言:javascript
复制
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

EN

回答 2

Stack Overflow用户

发布于 2019-09-12 18:03:06

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

MAXPARAMSIZEDEFAULTPARAMSIZE

如果您在odbc配置中将DEFAULTPARAMSIZE设置为更高的值,可能会发生这种情况:

https://docs.exasol.com/connect_exasol/drivers/odbc/using_odbc.htm?Highlight=varchar

票数 1
EN

Stack Overflow用户

发布于 2019-09-13 20:02:50

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57200898

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档