R 将所需变量从 ODBC/HANA 连接传递到 sql 语句

Posted

技术标签:

【中文标题】R 将所需变量从 ODBC/HANA 连接传递到 sql 语句【英文标题】:R Pass required variable from ODBC/HANA connection to sql statement 【发布时间】:2019-10-29 15:26:54 【问题描述】:

我有一张桌子我想用我常用的方法调用

sql <- 'SELECT TOP 10 *
         FROM "_SYS_BIC"."data-path.self-service.DOIP/table_name"'

df <- dbGetQuery(jdbcConnection, sql)

并收到错误

Error in .verify.JDBC.result(r, "Unable to retrieve JDBC result set for ",  : 
  Unable to retrieve JDBC result set for SELECT TOP 10 *
         FROM "_SYS_BIC"."data-path.self-service.DOIP/table_name" (SAP DBTech JDBC: [2048]: column store error: search table error:  [34023] Instantiation of calculation model failed;exception 306106: Undefined variable: $$IP_ExtractionWeekFrom$$. Variable is marked as required but not set in the query)

我一直在尝试使用 where 子句将 IP_ExtractionWeekFrom 插入到 sql 语句中,但没有成功

param1 <- 201943

sql <- 'SELECT TOP 10 *
         FROM "_SYS_BIC"."ccf-edw.self-service.DOIP/R_CA_B_DemandPlan" where
         "$$IP_ExtractionWeek$$" = ?'

SpringVisit <- dbGetQuery(jdbcConnection, sql, param1)

我已经尝试过用“$$”和没有“$$”包围的术语,无论有没有“$$”都用引号括起来,而不是。通常会遇到“无效的列名”错误。

这应该用 where 子句以外的东西来调用吗?

【问题讨论】:

下面带有硬编码参数值的查询是否在您的 SAP / hana 控制台或 IDE 或工作台(即 R 之外)中工作? 我们本身没有。在我加入之前,大多数数据都是通过我们的 Tableau/HANA 连接提取的,其 sql 显示为 SELECT * FROM "ccf-edw.self-service.DOIP::Q_CA_B_DemandPlan" ( 'PLACEHOLDER' = ('$$IP_ExtractionWeekFrom$$', '201943'), 'PLACEHOLDER' = ('$$IP_ExtractionWeekTo$$', '201943') ) "ccf_edw_self_service_DOIP__Q_CA_B_DemandPlan" WHERE (1 &lt;&gt; 0) 您是否在 R 中尝试过该查询?结果如何? 没错,语法错误param1 &lt;- 201943 param2 &lt;- 201943 sql &lt;- 'SELECT TOP 10 * FROM "_SYS_BIC"."ccf-edw.self-service.DOIP/R_CA_B_DemandPlan" ( "PLACEHOLDER" = ("$$IP_ExtractionWeekFrom$$", ?), "PLACEHOLDER" = ("$$IP_ExtractionWeekTo$$", ?) ) "_SYS_BIC"."ccf-edw.self-service.DOIP/R_CA_B_DemandPlan" WHERE (1 &lt;&gt; 0)' SpringVisit &lt;- dbGetQuery(jdbcConnection, sql, param1, param2) (SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near """: line 2 col 91 (at pos 107)) 为什么要双引号 "PLACEHOLDER""$$IP_ExtractionWeekTo$$"?双引号表示 SQL 中的特定事物,不能与 R 中的单引号互换。保持原样并将整个 SQL 包裹在 R 变量的双引号中,然后用反斜杠转义任何 SQL 双引号。 【参考方案1】:

考虑使用 R 中的参数集成来维护您的工作 Tableau 查询,并正确处理标识符的双引号和文字的单引号。

此外,旧的('PLACEHOLDER'= ('&lt;varname&gt;', &lt;varvalue&gt;)) 语法不支持参数化。

相反,如How to escape sql injection from HANA placeholder 中所述,请使用PLACEHOLDER."&lt;varname&gt;" =&gt; ? 语法。

param1 <- 201943

sql <- "SELECT TOP 10 * 
        FROM \"_SYS_BIC\".\"ccf-edw.self-service.DOIP/R_CA_B_DemandPlan\"( 
             PLACEHOLDER.\"$$IP_ExtractionWeekFrom$$\", ?), 
             PLACEHOLDER.\"$$IP_ExtractionWeekTo$$\",?) 
        )\"_SYS_BIC\".\"ccf-edw.self-service.DOIP/R_CA_B_DemandPlan\" 
        WHERE (1 <> 0)"

SpringVisit <- dbGetQuery(jdbcConnection, sql, param1, param1)

另外,如果您的 JDBC 已经连接到 schema_SYS_BIC,请使用 synonymous qualifier :: 作为原始查询以引用包和计算视图:

sql <- "SELECT TOP 10 * 
        FROM \"ccf-edw.self-service.DOIP::R_CA_B_DemandPlan\"( 
             PLACEHOLDER.\"$$IP_ExtractionWeekFrom$$\", ?), 
             PLACEHOLDER.\"$$IP_ExtractionWeekTo$$\", ? ) 
        )\"ccf-edw.self-service.DOIP::R_CA_B_DemandPlan\" 
        WHERE (1 <> 0)"

【讨论】:

在第一个(SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "?": line 3 col 59 (at pos 148)) 中仍然出现语法错误,非常感谢该链接,一直想知道这种差异。将 JDBC 连接到模式,并且还获得了“?”附近的语法。错误。 这实际上是一个不同的错误。看来您可能无法参数化。尝试将? 替换为dbGetQuery 中不带参数的实际数字,然后查看查询是否运行。 是的!我们去吧。非常感谢。如果您想编辑您的回复,新的 sql 语句读取为 sql &lt;- "SELECT TOP 10 * FROM \"ccf-edw.self-service.DOIP::R_CA_B_DemandPlan\"( 'PLACEHOLDER' = ('$$IP_ExtractionWeekFrom$$', '201943'), 'PLACEHOLDER' = ('$$IP_ExtractionWeekTo$$', '201943') )\"ccf-edw.self-service.DOIP::R_CA_B_DemandPlan\" WHERE (1 &lt;&gt; 0)" @jarichardson,请参阅已编辑的解决方案,因为 SAP HANA 专家显示更新的占位符语法支持参数化。

以上是关于R 将所需变量从 ODBC/HANA 连接传递到 sql 语句的主要内容,如果未能解决你的问题,请参考以下文章

将所选图像从 uiscrollView 传递到其他 viewController

将数据从 vanilla Javascript 传递到 React 的最佳方式? [关闭]

将变量名称作为参数从外部函数传递到 R 中的内部函数时出现问题?

如何设置 Visual Studio 以将所需的 DLL 文件复制到发布版本中的发布目录中?

php 如果尚未加载,则将所需的脚本和样式加载到页面中。

如何使用基于策略的授权将所需的声明附加到令牌?