2015-07-10 35 views
1

我正在嘗試使用GO來讓R從SQL Server數據庫中提取多部分查詢,但是當我嘗試這樣做時,R仍然不斷向我發送錯誤消息。有誰知道解決方法讓RODBC運行多部分查詢?使用RODBC在SQL Server中進行多部分查詢

例子查詢:

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環境中執行它時,它只是返回一個「整數(0)」響應,甚至沒有錯誤消息。我也收到了諸如'[1]「的錯誤消息42000 2812 [Microsoft] [ODBC SQL Server Driver] [SQL Server]無法找到存儲過程'getAttCeData'」。 [2]「[RODBC]錯誤:無法SQLExecDirect'EXEC getAttCeData'」'但這只是因爲我連接到服務器內的錯誤數據庫。你知道爲什麼它可能不會返回任何結果數據集?該過程在MSSQL中工作正常 – Moderat

+0

嘗試添加'dbo'前綴:'exec dbo.getAttCeData'。在MSSQL裏面,你不需要明確地添加'dbo',但是它可能是必需的。 – Parfait

相關問題