2015-07-10 2 views
1

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

Пример запроса:

query2 = "IF OBJECT_ID('tempdb..#ATTTempTable') IS NOT NULL 
    DROP TABLE #ATTTempTable 

GO 

SELECT 
    * INTO #ATTTempTable 
FROM ETL.ATT.fact_responses fr 
WHERE fr.ResponseDateTime > '2015-07-06' 
" 
channel <- odbcConnect("<host name>", uid="<uid>", pwd="<pwd>") 
raw = sqlQuery(channel, query2) 
close(channel) 

и результат

> raw 
[1] "42000 102 [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Incorrect syntax near 'GO'."                                    
[2] "[RODBC] ERROR: Could not SQLExecDirect 'IF OBJECT_ID('tempdb..#ATTTempTable') IS NOT NULL\n DROP TABLE #ATTTempTable\n\nGO\n\nSELECT\n\t* INTO #ATTTempTable\nFROM ETL.ATT.fact_responses fr\nWHERE fr.ResponseDateTime > '2015-07-06'\n'" 
> 

ответ

1

Поскольку ваш запрос содержит несколько строк с условной логикой, он напоминает хранимую процедуру.

Просто сохраните эту хранимую процедуру в SQL Server:

CREATE PROCEDURE sqlServerSp @ResponseDateTime nvarchar(10) 
AS  
IF OBJECT_ID('tempdb..#ATTTempTable') IS NOT NULL 
    DROP TABLE #ATTTempTable;  
GO  
-- suppresses affected rows message so RODBC returns a dataset 
SET NO COUNT ON; 
GO 
-- runs make-table action query 
SELECT * INTO #ATTTempTable 
FROM ETL.ATT.fact_responses fr 
WHERE fr.ResponseDateTime > @ResponseDateTime; 
GO 

А затем запустить хранимую процедуру в R. Вы можете даже передавать параметры как дата:

channel <- odbcConnect("<host name>", uid="<uid>", pwd="<pwd>") 
raw = sqlQuery(channel, "EXEC sqlServerSp @ResponseDateTime='2015-07-06'") 
close(channel) 
+0

Действительно классная идея! Я дам вам знать, когда я попробую. Благодаря! – Moderat

+0

У меня есть хранимая процедура, которая отлично работает на сервере, но когда я пытаюсь выполнить ее в среде Rstudio, она просто возвращает ответ «integer (0)», даже сообщение об ошибке. Я также получил сообщения об ошибках типа «[1]» 42000 2812 [Microsoft] [драйвер SQL Server ODBC] [SQL Server] Не удалось найти хранимую процедуру «getAttCeData». [2] "[RODBC] ОШИБКА: Не удалось SQLExecDirect 'EXEC getAttCeData'", но это было только потому, что я подключался к неправильной базе данных на сервере. Вы знаете, почему он не может возвращать набор данных результатов? Эта процедура отлично работает, когда в MSSQL – Moderat

+0

Попробуйте добавить префикс 'dbo':' exec dbo.getAttCeData'. Внутри MSSQL вам не нужно явно добавлять 'dbo', но вне этого может потребоваться. – Parfait

Смежные вопросы