#sql-server #r
#sql-server #r
Вопрос:
Использование пакета rodbc для запроса sql server из R. Необходимо передать значение даты / времени в SqlQuery как часть инструкции where
btime <- "2016-10-17 18:00:00"
etime <- "2016-10-17 19:00:00"
sqlQuery(cn, "select * from [blah].[blah] where metric = 'name' and date_time >= Convert(datetime, **btime**) and date_time <= Convert(datetime, **etime**)")
Ответ №1:
Я рекомендую RODBCext
пакет для этого:
library(RODBCext)
sqlQuery(cn,
"select * from [blah].[blah] where metric = ? and date_time >= ? and date_time <= ?",
data = list("name",
btime,
etime),
fetch = TRUE,
stringsAsFactors = FALSE)
RODBCext
действительно упрощает использование параметризованного запроса, где вы можете поместить ?
в коде запроса, где вы хотите поместить параметр. Поскольку ваши btime
и etime
уже находятся в соответствующем формате для SQL, вы можете передать их в виде строк. Я также создал 'name'
параметр в запросе, чтобы избежать использования кавычек в запросе (см. https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html подробнее).
sqlExecute
это действительно удобный способ уйти от рабочих строк в ваших запросах.
Комментарии:
1. Итак, это что-то вроде
sprintf.SQL
, а не то, что такая функция существует? И я вижу, что вы косвенно ссылаетесь на мем Little Bobby Tables. xkcd.com/3272. библиотека (RODBC) cn <- odbcDriverConnect (подключение =»Драйвер ={SQL Server}; сервер =***; база данных = ***;UID = ***; PWD = ***;») Выборка данных <- SqlQuery(cn, «выберите top 1000 * из [dbo]. [vwPerfmonDataCert] где CounterName = ‘Процесс:% процессорного времени: w3wp'»)
3. Но это не:
4. библиотека (RODBCext) cn <- odbcDriverConnect(подключение =»Драйвер ={SQL Server}; сервер = PSPERFINTRANET; база данных =***;UID = ***; PWD = ***;») SqlQuery(cn, «выберите top 10 * из [dbo]. [VWPerfmonDataCert] где metric = ?», data = list(«Процесс:% процессорного времени: w3wp», fetch = TRUE, stringsAsFactors = FALSE))
5. Используйте
sqlExecute
вместоsqlQuery
. Кроме того, в вашем рабочем примере у вас естьCounterName =
, но в вашем неудачном примере у вас естьmetric =