首页 > 解决方案 > 带有临时表的 RODBC::sqlQuery 给出了空字符向量,尽管查询在 SSMS 中工作并且较小的查询在相同的连接下工作

问题描述

我正在尝试从 SQL 查询的结果中提取数据框。由于使用 odbc 和 DBI 时 PC 之间的兼容性问题,我正在为此使用 RODBC。连接是这样指定的:

my_server="servername"
my_db = "databasename"

connect_rodbc <- RODBC::odbcDriverConnect(paste0("DRIVER={SQL Server};
                                 server=",my_server,";
                                 database=",my_db,";trusted_connection=true"))

我的脚本中除了一个查询之外的所有查询都工作正常,但昨天工作正常并且在 SQL Server Management Studio 中工作正常的查询现在返回一个空向量而不是所需的数据框,我不知道为什么。

查询格式为:

dataset_needed <- RODBC::sqlQuery(connect_rodbc, "

IF OBJECT_ID ('tempdb..#Date') IS NOT NULL
DROP TABLE #Date
SELECT DISTINCT [Month]
INTO #Date
FROM [dbo].[TIMES_TABLE]
WHERE [Week End Date] BETWEEN  DATEADD(MONTH, -2, GETDATE()) and GETDATE() 

IF OBJECT_ID ('tempdb..#Product') IS NOT NULL
DROP TABLE #Product
SELECT DISTINCT [Product Code], [Product Group]
INTO #Product
FROM [dbo].[PRODUCT_TABLE]
WHERE [Product Group] IN ('DVDs', 'CDs')

SELECT [Month],
SUM([Volume]) AS 'Volume'

  FROM [databasename].[dbo].[SALES_TABLE] r

  INNER JOIN #Date d ON r.[Month Code] = d.[Month Code]
  INNER JOIN #Product p on r.[Product Code] = p.[Product Code]  

  GROUP BY [Month]
                           ")

然而:

test <- RODBC::sqlQuery(connect_rodbc, " SELECT TOP 10 * FROM SALES_TABLE")

工作正常并按预期返回具有 10 个观察值的数据框,因此连接仍然有效。

原始查询在 SQL Sever Management Studio 中运行大约需要 2 分钟,在 R 中运行似乎需要大约相同的时间,但它只会导致空字符向量

有谁知道这可能是为什么?

标签: sqlrodbcrodbc

解决方案


更新:

删除临时表似乎导致查询再次工作,这很奇怪,因为我可以发誓它昨天工作正常。

我正在使用的新脚本(不太确定缩进发生了什么)是:

dataset_needed <- RODBC::sqlQuery(connect_rodbc, "

SELECT [Month],
SUM([Volume]) AS 'Volume'

FROM [databasename].[dbo].[SALES_TABLE] r

  INNER JOIN 
(SELECT DISTINCT [Month]
FROM [dbo].[TIMES_TABLE]
WHERE [Week End Date] BETWEEN  DATEADD(MONTH, -2, GETDATE()) and GETDATE()) as d 
ON r.[Month Code] = d.[Month Code]

  INNER JOIN 
(SELECT DISTINCT [Product Code]
FROM [dbo].[PRODUCT_TABLE]
WHERE [Product Group] IN ('DVDs', 'CDs')) as p
ON r.[Product Code] = p.[Product Code]

GROUP BY [Month]
                           ")

推荐阅读