Использование пакета rodbc для запроса sql server из R. Необходимо передать значение даты / времени в SqlQuery как часть инструкции where

#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/327

2. библиотека (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 =