如果请求18行或更多行,为什么使用RODBC的SAP HANA的sqlQuery不返回任何数据

时间:2016-08-16 08:08:21

标签: r hana rodbc

我有一台安装了HANA客户端的64位Windows 7计算机以及与SAP HANA数据库的ODBC连接。在ODBC数据源管理员中,我已添加到所需数据库的连接,并且可以成功连接。

我正在尝试使用RStudio检索数据以便使用R进行分析。我发现返回少量行(“TOP 1”到“TOP 17”)的查询成功返回所请求数字的所有71列数据行,但当我查询“TOP 18”或更高行数时,我得到所有列标题,但返回0行。

所以查询:

res<-sqlQuery(ch, 'SELECT TOP 17 * FROM "SAPL2P"."/BIC/PZRPA_CNO" WHERE "/BIC/ZRPA_DCD"=\'CONFIRMED\'')

产生17行数据,但

res2<-sqlQuery(ch, 'SELECT TOP 18 * FROM "SAPL2P"."/BIC/PZRPA_CNO" WHERE "/BIC/ZRPA_DCD"=\'CONFIRMED\'')

有0行数据。

任何可能导致超过17行不返回数据的想法?

4 个答案:

答案 0 :(得分:0)

我有类似的问题。起初我根本没有行返回。将believeNRows = FALSE和rows_at_time = 1添加到初始连接有助于至少恢复一些数据(直到发生故障)。在我的情况下,我只能检索5行,第6行失败,这有助于我识别数据库中的问题行。

最后,我认为根据您的建议,它与编码有关。我发现我的问题是倒置的单引号字符。

我在RODBC网站上找到了以下信息:

  

另一个   国际化问题是使用的字符编码。当R和   DBMS在同一台机器上运行,这不太可能   问题,在许多情况下,ODBC驱动程序有一些翻译选项   字符集。 SQL是ANSI(美国)标准,DBMS倾向于   假设字符数据是ASCII或者当前可能是   由ODBC驱动程序中的错误阻止,因此SQLColumns无法报告   在指定数据库中的表上。最近,DBMS已经开始   (可选地或默认情况下)以Unicode格式存储数据   不幸的是,Windows上的UCS-2和其他地方的UTF-8。所以跨OS   解决方案不能保证有效,但大多数解决方案都可以。

SAP HANA是一个以Unicode格式存储数据的数据库。

我尝试了各种选项来设置编码:

  1. 将RODBS.odbcConnect proc中的DBMSencoding属性设置为UTF-8,latin1,ISO8859-1和UCS-2而没有任何运气
  2. 我也尝试过在没有运气的情况下在RStudio中设置编码
  3. 最后,我决定在SAP HANA中创建一个视图来替换SQL中的问题字符。 replace(content,x,y) as content其中x是问题字符,y是替换字符。

    从那时起,RODBC可以毫无问题地检索数据。

    希望这有帮助

答案 1 :(得分:0)

好的,这里的问题实际上是Windows上的R如何处理来自ODBC的UTF数据(如前所述)。 围绕SO的快速搜索表明,对于具有许多不同DBMS的Windows上的R来说,这个问题非常常见。

对于SAP HANA,对我有用的是将以下参数添加到ODBC DSN(在ODBC驱动程序设置 - &gt;设置... - &gt;特殊属性设置中):

CHAR_AS_UTF8 | TRUE

这使SAP HANA ODBC将SQL_C_CHAR作为UTF8处理。

答案 2 :(得分:0)

由于SAP数据中存在波罗的海字符,因此问题解决方案需要2个部分。这两个步骤是:

  • 添加属性&#39; CHAR_AS_UTF8&#39;值为&#39; TRUE&#39;在ODBC DSN设置中,如上面提到的Lars。
  • 使用额外参数打开RStudio中的频道&#39; DBMSencoding =&#34; UTF-8&#34;&#39;

现在,用于打开HANA数据通道的RStudio命令: ch&lt; -odbcConnect(&#34; HA NA_QA_DS&#34;,uid =&#34; aaaaaa aa&#34;,pwd =&#34; bbbbbbbb&#34;,DBMSencoding =&#34; UTF-8&# 34)

谢谢,拉尔斯。您的意见有助于解决这个问题!

答案 3 :(得分:0)

我有同样的问题。 添加属性'CHAR_AS_UTF8'= 1对我来说不是一个选项,因为必须使用代码在每个新用户的系统上定义它。

在我的解决方案中,我将列转换为NCLOB。

res<-sqlQuery(ch, 'SELECT TO_NCLOB("COLUMNNAME") as "COLUMNNAME" FROM "SAPL2P"."MYSCHEMA"')

选择*时可能会很复杂。但是,大多数只有某些已知列会受到不需要的字符的影响。