使用 RODBC 在 SQL 服务器中进行多部分查询

Multipart queries in SQL Server with RODBC

我正在尝试使用 GO 让 R 从 SQL 服务器数据库中提取多部分查询,但是当我尝试这个时,R 总是出错。有谁知道让 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'"
> 

你不能。参见 https://msdn.microsoft.com/en-us/library/ms188037.aspx

您必须将查询分成两个语句,然后 运行 将它们分开。

因为您的查询包含多行条件逻辑,所以它类似于存储过程。

只需将该存储过程保存在 SQL 服务器:

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)