2016-08-24 4 views
0

Я пытаюсь передать запрос на доступ с помощью пакета RODBC в R. Я могу импортировать целые таблицы с помощью sqlFetch, но я ищу данные для сбора вишни с помощью запроса.sqlQuery с использованием переменной ограничения не работает.

Однако я хотел бы использовать переменную R для выбора одного из ограничений (Shaft_ID).

Чтобы построить SQL-запрос, я использовал и Cat и Paste, чтобы использовать кавычки вокруг переменной Shaft.

Мой код выглядит следующим образом:

Shaft<- "S001" 
BL <- sqlQuery(myDBcon, paste("SELECT * FROM BL_FGSL WHERE Shaft_ID ='",Shaft,"'"), error = TRUE, as.is = TRUE) 

Это создает кадр данных, но он не находит каких-либо значений. Если я заменю переменную напрямую на «S001», она будет работать!

Любые идеи?

+1

Я не думаю, что вы должны использовать 'cat' там. Просто пропустите это. – Roland

+0

'cat' используется только для побочного эффекта записи в STDOUT (или файл); он возвращает 'NULL', а не печатный текст -' is.null (cat (1: 5, "\ n")) '. – nrussell

+0

Причина, по которой вы ничего не возвращаете, - это запрос, который ищет '' S001 ''(с пробелами с обеих сторон), потому что вы использовали' paste() 'без указания разделителя: либо используйте' paste (, sep = "") ' или 'paste0 ()' – Parfait

ответ

1

SQL использует символ одиночной кавычки ', но сопоставление котировок в SQL-инъекции может быть раздражающим и не рекомендуется.

Я бы рекомендовал параметризовать ваш запрос и позволить компьютеру выполнять работу по управлению вашими котировками для вас.

library(RODBC) 
library(RODBCext) 

Shaft<- "S001" 

BL <- 
    sqlExecute(myDBcon, 
      query = "SELECT * FROM BL_FGSL WHERE Valid = TRUE AND Shaft_ID = ?", 
      data = list(Shaft_ID = Shaft), 
      fetch = TRUE, 
      stringsAsFactors = FALSE, 
      error = TRUE) 

https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html

+0

Спасибо за то, что Бенджамин, и сообщив, что существует RODBCext! Я пробовал код, но я получаю следующие ошибки: - Ошибка в sqlExecute (myDBcon, query = "SELECT * FROM BL_FGSL WHERE Valid = TRUE AND Shaft_ID =?",: HY104 98 [Microsoft] [ODBC Microsoft Access Driver] Invalid значение точности [RODBCext] Ошибка: SQLBindParameter не удался дополнительно: Предупреждение сообщения: HY104 98 [Microsoft] [ODBC Microsoft Access Driver] Invalid значения точности –

+0

это вопрос с соответствующими типами данных –

+0

Похоже, что это Что такое тип данных для 'Shaft_ID'? – Benjamin