R Передать требуемую переменную из соединения ODBC / HANA в оператор sql

У меня есть таблица, которую я пытаюсь вызвать обычным способом

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)

Я пытался вставить IP_ExtractionWeekFrom в оператор sql с предложением where без везения

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?


person jarichardson    schedule 29.10.2019    source источник
comment
Работает ли приведенный ниже запрос с жестко заданным значением параметра в вашей консоли SAP / hana, в среде IDE или в рабочей среде (т.е. вне R)?   -  person Parfait    schedule 29.10.2019
comment
У нас его нет как такового. До моего присоединения большинство данных было получено через наше соединение 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 <> 0)   -  person jarichardson    schedule 29.10.2019
comment
Вы пытались выполнить этот запрос в R? Каков был результат?   -  person Parfait    schedule 29.10.2019
comment
Конечно, ошибка синтаксиса param1 <- 201943 param2 <- 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, param2) (SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near """: line 2 col 91 (at pos 107))   -  person jarichardson    schedule 29.10.2019
comment
Почему вы используете двойные кавычки "PLACEHOLDER" и "$$IP_ExtractionWeekTo$$"? Двойные кавычки означают определенную вещь в SQL и не взаимозаменяемы с одинарными кавычками, как в R. Сохраните как есть и заключите весь SQL в двойные кавычки для переменной R, а затем избегайте любых двойных кавычек SQL с помощью обратной косой черты.   -  person Parfait    schedule 29.10.2019
comment
Я все еще не совсем уверен в этом, но период между _SYS_BIC и именем таблицы должен быть разделен окружением SYS_BIC и таблицы в двойных кавычках, поэтому для всего этого используются одинарные кавычки. stackoverflow.com/questions/57498890/   -  person jarichardson    schedule 29.10.2019


Ответы (1)


Рассмотрите возможность поддержки вашего рабочего запроса Tableau с интеграцией параметров в R с правильной обработкой двойных кавычек для идентификаторов и одинарных кавычек для литералов.

Кроме того, параметризация не поддерживается старым синтаксисом ('PLACEHOLDER'= ('<varname>', <varvalue>)).

Вместо этого, как описано в Как избежать внедрения sql из заполнителя HANA используйте синтаксис PLACEHOLDER."<varname>" => ?.

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, используйте синонимичный квалификатор :: в качестве исходного запроса для ссылки на пакет и представление вычислений:

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)"
person Parfait    schedule 29.10.2019
comment
По-прежнему появляется синтаксическая ошибка в первом (SAP DBTech JDBC: [257]: sql syntax error: incorrect syntax near "?": line 3 col 59 (at pos 148)) Эта ссылка очень ценится, интересно узнать об этой разнице. Подключили JDBC к схеме, а также получили синтаксис? ошибка. - person jarichardson; 29.10.2019
comment
На самом деле это другая ошибка. Похоже, вы не сможете параметризовать. Попробуйте заменить ? фактическими числами без параметров в dbGetQuery и посмотрите, выполняется ли запрос. - person Parfait; 29.10.2019
comment
Да! Итак, мы идем. Большое спасибо. Новый оператор sql читается как sql <- "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 <> 0)", если вы хотите изменить свой ответ. - person jarichardson; 29.10.2019
comment
@jarichardson, см. отредактированное решение, поскольку эксперт по SAP HANA показывает, что параметризация поддерживается с новым синтаксисом заполнителя. - person Parfait; 30.10.2019