Из предложения в предложениях RODBC - SAP HANA
Я не могу понять ниже FROM
пункт для работы с использованием RODBC sqlQuery
, Я воспользовался советом @Lars Br. с точки зрения цитирования, но это все еще не работает. я
Я знаю, что часть заполнителя работает, так как я использовал это в qlikview
Извлечение таблицы из HANA с использованием R
Так работает приведенный ниже код
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'))')
Теперь я знаю, что мои одиночные кавычки - вот что портит, поэтому я попробовал следующее.
- заменил все одинарные кавычки на двойные - это не сработало
- инкапсулировал все одинарные кавычки в двойные кавычки
- полностью удалил все одинарные кавычки.
2 ответа
Здесь вы попадаете в ловушки вложенного синтаксиса и многоуровневой обработки операторов:
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() ожидает всю командную строку SQL во втором параметре. Это включает в себя синтаксис WITH PARAMETER HANA.
Чтобы избежать таких проблем, можно было бы сначала назначить команду 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 в действии. Еще раз спасибо!
Ссылка ниже помогла мне понять концепцию.
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)