如果请求 18 行或更多行,为啥使用 RODBC 来自 SAP HANA 的 sqlQuery 不返回数据

Posted

技术标签:

【中文标题】如果请求 18 行或更多行,为啥使用 RODBC 来自 SAP HANA 的 sqlQuery 不返回数据【英文标题】:Why does sqlQuery from SAP HANA using RODBC return no data if request 18 or more rows如果请求 18 行或更多行,为什么使用 RODBC 来自 SAP HANA 的 sqlQuery 不返回数据 【发布时间】:2016-08-16 08:08:21 【问题描述】:

我有一台 64 位 Windows 7 计算机,安装了 HANA 客户端并通过 ODBC 连接到 SAP HANA 数据库。在 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 行?

【问题讨论】:

在 SAP HANA Studio 中运行查询时,是否返回所有记录? 我没有安装 HANA Studio。我可能会看看是否可以安装它,但这不是必需的。同时,我会请一位同事检查他们是否在 HANA STUDIO 中返回结果。 在 HANA STUDIO 中,查询在使用 TOP 18 运行时确实返回了预期的 18 条记录。TOP 200 也返回了前 200 条记录。 从通过 HANA STUDIO 提取的数据中,我注意到在第 18 条记录中,有一个字符字段包含一个立陶宛字符(上面有一个点的“E”)。前 17 行没有任何此类字符。这可能是一个原因吗? 【参考方案1】:

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

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

CHAR_AS_UTF8 |是的

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

【讨论】:

谢谢,拉斯。此更改确实可以返回带有重音字符的行,但字符转换不正确。看起来代码页可能还有其他问题。这也可以通过 ODBC 属性设置来配置,例如使用 cp1257? 好的,我找到了!除了上述解决方案,我还需要在 RStudio 中打开频道时将 UTF-8 指定为 DBMS 编码:'ch 【参考方案2】:

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

按照 Lars 上面的建议,在 ODBC DSN 设置中添加值为“TRUE”的属性“CHAR_AS_UTF8”。 使用额外参数“DBMSencoding="UTF-8"‌'在 RStudio 中打开通道”​

所以现在打开 HANA 数据通道的 RStudio 命令是: ch

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

【讨论】:

【参考方案3】:

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

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

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

在选择 *.但是,大多数情况下,只有某些已知列会受到不需要的字符的影响。

【讨论】:

【参考方案4】:

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

最后,我相信这与您上面建议的编码有关。我发现我的问题出在倒单引号字符上。

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

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

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

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

    将 RODBS.odbcConnect proc 中的 DBMSencoding 属性设置为 UTF-8、latin1、ISO8859-1 和 UCS-2,但运气不佳 我也尝试在 RStudio 本身中设置编码,但运气不好

最后,我决定在 SAP HANA 中创建一个视图来替换 SQL 中的问题字符。 replace(content,x,y) as content 其中 x 是问题字符,y 是替换字符。

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

【讨论】:

看起来你有解决方案的第二部分 - 添加 DBMSencoding 属性。 :) 很高兴它帮助了@db533。不幸的是,即使在我的 ODBC DSN 中添加了 CHAR_AS_UTF8 之后,我仍然无法让它在我身边工作。您能否告诉我您是否使用 TRUE 或 1 作为变量的值。另外,您使用的是 HDBODBC 驱动程序以及哪个版本?谢谢,雅诗兰黛 我使用 TRUE 作为变量的值。是的,我正在使用 HDBODBC 驱动程序。版本是 1.00.112.04。文件名是 LIBODBCHDB.DLL

以上是关于如果请求 18 行或更多行,为啥使用 RODBC 来自 SAP HANA 的 sqlQuery 不返回数据的主要内容,如果未能解决你的问题,请参考以下文章

如果活动单元格(两行或更多行)位于同一列中,则突出显示单元格

如何将 2 行或更多行的数据添加到 postgresql 中的一行

当有更多行或查询变得更复杂时,分区视图会读取所有表? SQL Server 2008 错误?

R 中的 RODBC 包使用引号创建列名......为啥?

RODBC:为啥 sqlQuery() 中的空值和仅空格值的值为“NA”?

如果使用命令行或 sql 在大查询中不存在表,如何创建表