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'))')
现在我知道是我的单引号搞砸了所以我尝试了以下方法。
- 将所有单引号替换为双引号 - 这没有用
- 将所有的单引号用双引号括起来
- 完全删除了所有单引号。
这里你掉进了嵌套语法和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)
我似乎无法使用 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'))')
现在我知道是我的单引号搞砸了所以我尝试了以下方法。
- 将所有单引号替换为双引号 - 这没有用
- 将所有的单引号用双引号括起来
- 完全删除了所有单引号。
这里你掉进了嵌套语法和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)