RODBC 报价单中的从句 - SAP HANA

From Clause in RODBC Quotations - SAP HANA

我似乎无法使用 RODBC 的 sqlQuery 使下面的 FROM 子句起作用。我采纳了@Lars Br 的建议。在报价方面,但它仍然不起作用。我是

我知道占位符部分是有效的,因为我在 qlikview 中使用过它

所以下面的代码有效

table <- sqlQuery(myconn, 'SELECT *
                      FROM "_SYS_BIC"."mytable.TABLE/ALL_DATA"')

但是当我尝试添加以下内容时(我正在传递我的日期参数)

table <- sqlQuery(myconn, 'SELECT *
                      FROM "_SYS_BIC"."mytable.TABLE/ALL_DATA"')   
                    ('PLACEHOLDER' = ('$$AS_OF_DATE$$',
                     '2017-01-09'),
                    'PLACEHOLDER' = ('$$ABCD_ONE$$',
                     '0'),
                    'PLACEHOLDER' = ('$$ABCD_TWO$$',
                     '0'),
                     'PLACEHOLDER' = ('$$EFGH$$',
                    '12345'),
                    'PLACEHOLDER' = ('$$FLAG$$',
                      '1'))')

现在我知道是我的单引号搞砸了所以我尝试了以下方法。

  1. 将所有单引号替换为双引号 - 这没有用
  2. 将所有的单引号用双引号括起来
  3. 完全删除了所有单引号。

这里你掉进了嵌套语法和multi-level语句处理的陷阱:

table <- sqlQuery >(< myconn, 'SELECT *
                  FROM "_SYS_BIC"."mytable.TABLE/ALL_DATA"'>)< ---!   
                ('PLACEHOLDER' = ('$$AS_OF_DATE$$',
                 '2017-01-09'),
                'PLACEHOLDER' = ('$$ABCD_ONE$$',
                 '0'),
                'PLACEHOLDER' = ('$$ABCD_TWO$$',
                 '0'),
                 'PLACEHOLDER' = ('$$EFGH$$',
                '12345'),
                'PLACEHOLDER' = ('$$FLAG$$',
                  '1'))')

对于 R,你的命令在我放置 < ---! 的地方结束,其余的对 R 无效。
在这种情况下,重要的是要记住 sqlQuery() 函数需要第二个参数中的 whole SQL 命令字符串。 这包括 HANA 的 WITH PARAMETER 语法。

为避免此类问题 - 首先将 SQL 命令分配给一个变量,并且仅在函数调用中使用该变量。
为了使用 R 变量设置参数,您可以使用文本替换。

# create the date parameter in the right format YYYY-MM-DD
selDate <- format(Sys.Date() , "%F")

selDate [1] "2017-02-04"

# create the base SQL command with %D as a placeholder for the selDate
# note how all single quotes inside the sqlCMD need to be escaped by a \
 sqlCMD <- 'SELECT *
 +                   FROM "_SYS_BIC"."mytable.TABLE/ALL_DATA"   
 + (\'PLACEHOLDER\' = (\'$$AS_OF_DATE$$\', \'%D\'),
 + \'PLACEHOLDER\' = (\'$$ABCD_ONE$$\', \'0\'),
 + \'PLACEHOLDER\' = (\'$$ABCD_TWO$$\', \'0\'),
 + \'PLACEHOLDER\' = (\'$$EFGH$$\', \'12345\'),
 + \'PLACEHOLDER\' = (\'$$FLAG$$\', \'1\'))'

sqlCMD [1] "SELECT *\n+ FROM \"_SYS_BIC\".\"mytable.TABLE/ALL_DATA\" \n+ ('PLACEHOLDER' = ('$$AS_OF_DATE$$', '%D'),\n+ 'PLACEHOLDER' = ('$$ABCD_ONE$$', '0'),\n+ 'PLACEHOLDER' = ('$$ABCD_TWO$$', '0'),\n+ 'PLACEHOLDER' = ('$$EFGH$$', '12345'),\n+ 'PLACEHOLDER' = ('$$FLAG$$', '1'))"

# now subsitute the %D with the selDate
sqlCMD <- gsub ("%D", selDate, sqlCMD)

sqlCMD [1] "SELECT *\n FROM \"_SYS_BIC\".\"mytable.TABLE/ALL_DATA\" \n('PLACEHOLDER' = ('$$AS_OF_DATE$$', '2017-02-04'),\n'PLACEHOLDER' = ('$$ABCD_ONE$$', '0'),\n'PLACEHOLDER' = ('$$ABCD_TWO$$', '0'),\n'PLACEHOLDER' = ('$$EFGH$$', '12345'),\n'PLACEHOLDER' = ('$$FLAG$$', '1'))"

  # finally run the query
  table <- sqlQuery(myconn, sqlCMD)

当然,所有一般建议(例如 使用 SELECT * 或确保在获取结果数据集之前进行正确的过滤和聚合)都适用。

好吧@Lars Br。您的答案是拼图的第一部分,第二部分是转义单引号。下面是有效的 SQLcmd 变量以及正在运行的 sqlQuery 函数。再次感谢!

下面的link帮助我理解了这个概念。

Error: unexpected symbol/input/string constant/numeric constant/SPECIAL in my code

sqlCMD <- 'SELECT *
              FROM "_SYS_BIC"."mytable.TABLE/ALL_DATA"
              (\'PLACEHOLDER\' = (\'AS_OF_DATE$$\',\'2017-01-09\'),
              \'PLACEHOLDER\' = (\'$$ABCD_ONE$$\',\'0\'),
              \'PLACEHOLDER\' = (\'$$ABCD_TWO$$\',\'0\'),
              \'PLACEHOLDER\' = (\'$$EFGH$$\',\'123456\'),
              \'PLACEHOLDER\' = (\'$$FLAG$$\',\'1\'))'

table <- sqlQuery(myconn, sqlCMD)