Временная ошибка 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 представляет интересующий запрос.