Как использовать параметризованный SQL с dplyr?

Я пытаюсь выполнить SQL-запрос с помощью dplyr на SQL Server:

tbl(con, sql(sqlQuery))

Запрос создается динамически с использованием sprintf("SELECT ... WHERE a = '%s'). Это плохая практика, потому что ею можно злоупотреблять для SQL-инъекций, но я не могу найти никакой документации или рабочих примеров для параметризованных запросов в dplyr. Это можно сделать, как?

Соединение (con) использует DBI, библиотеку odbc и драйвер ODBC {SQL Server Native Client 11.0}:

con <- DBI::dbConnect(odbc::odbc(),
                      Driver = "{SQL Server Native Client 11.0}",

person ckarras    schedule 21.08.2017    source источник
comment
Здесь есть некоторая документация .   -  person Scarabee    schedule 21.08.2017
comment
Я не думаю, что это сработает с функцией tbl. В перечисленных параметрах кажется, что с tbl будет работать только dbGetQuery, но dbGetQuery не поддерживает параметры. (tbl не будет работать с серией вызовов функций, таких как dbSendQuery / dbBind / dbFetch / dbClearResults). sqlInterpolate может работать, но я надеялся на то, что использует синтаксис базового драйвера SQL.   -  person ckarras    schedule 24.08.2017
comment
sqlInterpolate работает с tbl: sqlQuery <- sqlInterpolate(con, "select count(*) from mytable where var = ?value", value = 10) ; tbl(con, sql(sqlQuery)). Я не уверен, что понимаю, чего вы ожидаете, не могли бы вы рассказать подробнее?   -  person Scarabee    schedule 25.08.2017
comment
Я искал что-то, что использует синтаксис базового драйвера для параметров, например @ParameterName для SQL Server, чтобы облегчить повторное использование существующих запросов. Но я протестировал ваш пример с помощью sqlInterpolate, и он может работать, если это единственный вариант, спасибо   -  person ckarras    schedule 25.08.2017
comment
Теперь я понимаю, но не знаю ни одного хорошего решения. Вы можете добавить gsub("@", "?", .) вокруг своего запроса, но это не очень чисто.   -  person Scarabee    schedule 25.08.2017


Ответы (1)


В зависимости от того, для чего вам нужны ваши параметры, на основе вашего примера это может выглядеть как оператор WHERE, вы можете просто определить параметр в R, а затем использовать его в своих глаголах dplyr.

my_param <- "FILTER_VALUE" #create param
my_table <- tbl(con, "TABLE_NAME") #create ref tibble
my_table <- my_table %>% filter( a == my_param ) # filter by param
my_table <- my_table %>% collect() # execute query

На все, что вы назначаете в R, можно ссылаться в filter или mutate.

person Seth Raithel    schedule 14.11.2017