Проблема с временной таблицей RODBC при подключении к MS SQL Server - PullRequest
16 голосов
/ 20 января 2011

Я использую 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)

Ответы [ 2 ]

32 голосов
/ 11 июля 2012

Кажется, что драйвер RODBC считает, что когда SQL Server возвращает любое количество строк, весь оператор завершается.Поэтому вам нужно включить nocount в начале вашего оператора или вызванной хранимой процедуры.

set nocount on

Это позволило мне использовать хранимую процедуру, которая использовала временную таблицу в R.

3 голосов
/ 20 января 2011

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

...