R Передайте обязательную переменную из соединения ODBC / HANA в оператор SQL - PullRequest
1 голос
/ 29 октября 2019

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

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?

1 Ответ

2 голосов
/ 29 октября 2019

Подумайте о поддержании рабочего запроса 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 уже подключается ксхема _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)"
...