为什么使用 RODBC return 来自 SAP HANA 的 sqlQuery 如果请求 18 行或更多行则没有数据

Why does sqlQuery from SAP HANA using RODBC return no data if request 18 or more rows

我有一台 64 位 Windows 7 机器,安装了 HANA 客户端和一个到 SAP HANA 数据库的 ODBC 连接。在ODBC Data Source administrator中,我添加了一个连接到需要的数据库,可以成功连接。

我正在尝试使用 RStudio 检索数据以使用 R 进行分析。我发现查询 return 少数行("TOP 1" 到 "TOP 17")成功 return 请求行数的所有 71 列数据,但是当我查询 "TOP 18" 或更多行数时,我得到所有列标题,但 0 行 returned.

所以查询:

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 行数据。

有什么想法可能导致数据未被 returned 超过 17 行吗?

我遇到了类似的问题。起初,我根本没有 returns 行。将 believeNRows=FALSE 和 rows_at_time=1 添加到初始连接有助于至少带回一些数据(直到发生故障)。在我的例子中,我只能检索 5 行,第 6 行失败,这帮助我确定了数据库中的问题行。

最后,根据您上面的建议,我认为这与编码有关。我发现我的问题出在反单引号字符上。

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

The other internationalization issue is the character encoding used. When R and the DBMS are running on the same machine this is unlikely to be an issue, and in many cases the ODBC driver has some options to translate character sets. SQL is an ANSI (US) standard, and DBMSs tended to assume that character data was ASCII or perhaps currently this is stymied by bugs in the ODBC driver, so SQLColumns is unable to report on tables in specified databases. More recently DBMSs have started to (optionally or by default) to store data in Unicode, which unfortunately means UCS-2 on Windows and UTF-8 elsewhere. So cross OS solutions are not guaranteed to work, but most do.

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

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

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

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

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

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

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

CHAR_AS_UTF8 |真

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

解决方案原来需要 2 个部分,因为 SAP 数据中的波罗的海字符引起了这个问题。这 2 个步骤是:

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

因此,打开 HANA 数据通道的 RStudio 命令现在是: ch<-odbcConnect("HA‌​NA_QA_DS",uid="aaaaaa‌​aa",pwd="bbbbbbbb",DBMSencoding="UTF-8"‌ )

谢谢拉尔斯。您的意见对解决这个问题很有帮助!

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

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

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

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