Временная ошибка RODBC при подключении к MS SQL Server
Я запускаю R в unix, и я использую пакет RODBC для подключения к серверу MS SQL. Я могу выполнить запрос, который возвращает результаты с пакетом, но если я использую временную таблицу где-нибудь в своем SQL-запросе, мне возвращается пустая строка. Просмотрев веб-сайт, я думаю, проблема может заключаться в том, что пакет RODBC был написан в предположении, что конечный пользователь писал в стандартном SQL (в отличие от MS SQL). В качестве примера я привел приведенный ниже код.
Интересно, что временная проблема таблицы не существует, если я использую пакет RJDBC. Однако пакет RJDBC очень медленный, импортируя даже 80 000 строк (10 столбцов) и часто останавливается, так что это тоже не вариант. Кто-нибудь еще сталкивается с этой проблемой? Если есть альтернативные решения, о которых я не думал, я бы хотел их услышать.
Кажется, я не единственный с этой проблемой, возможно, это R-Bug?
http://r.789695.n4.nabble.com/RODBC-results-from-stored-procedure-td897462.html
Спасибо
Вот пример R:
library(RODBC)
ch <- odbcConnect(insert your server info here)
qry4 <- "create table #tempTable(
Test int
)
insert into #tempTable
select 2
select * from #tempTable
drop table #tempTable
"
df4 <- sqlQuery(ch, qry4)
Ответы
Ответ 1
Драйвер RODBC, похоже, считает, что когда SQL Server возвращает любое количество строк, полное завершение оператора. Поэтому вам нужно установить nocount в начале вашего оператора или хранимой процедуры, которая вызывается.
set nocount on
Это позволило мне использовать хранимую процедуру, которая использовала временную таблицу в R.
Ответ 2
Проблема заключается в синтаксисе SQL, а не в отношении R или пакета RODBC. Я вполне уверен, что вам нужно отделить свои SQL-команды командой go
, чтобы убедиться, что первый оператор завершил выполнение до второго, третьего и т.д. В качестве альтернативы вы можете разбить их на четыре разных оператора, как показано ниже. Это работает на моей машине:
library(RODBC)
ch <- odbcConnect("details")
qry1 <- "create table #temptable (test int)"
qry2 <- "insert into #temptable(test) values(2)"
qry3 <- "select * from #temptable"
qry4 <- "drop table #temptable"
sqlQuery(ch, qry1)
sqlQuery(ch, qry2)
doesItWork <- sqlQuery(ch, qry3)
sqlQuery(ch, qry4)
И вывод
> doesItWork
test
1 2
ИЗМЕНИТЬ
Включение всех ваших запросов в объект списка и повторение через них может сэкономить вам некоторую кодировку в будущем. Например:
queryList <- list(qry1, qry2, qry3, qry4)
sqlOutput <- lapply(queryList, function(x) sqlQuery(ch, x))
Это создаст какой-то внешний результат, который вам может не понравиться, но результаты, которые вас интересуют, можно потянуть с помощью sqlOutput[[3]]
, где 3 представляет интересующий запрос.