Из предложения в предложениях 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'))')

Теперь я знаю, что мои одиночные кавычки - вот что портит, поэтому я попробовал следующее.

  1. заменил все одинарные кавычки на двойные - это не сработало
  2. инкапсулировал все одинарные кавычки в двойные кавычки
  3. полностью удалил все одинарные кавычки.

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)
Другие вопросы по тегам