带有临时表的 RODBC::sqlQuery 提供空字符向量,尽管查询在 SSMS 中工作,较小的查询在相同的连接下工作
Posted
技术标签:
【中文标题】带有临时表的 RODBC::sqlQuery 提供空字符向量,尽管查询在 SSMS 中工作,较小的查询在相同的连接下工作【英文标题】:RODBC::sqlQuery with temporary tables gives empty character vector though query works in SSMS and smaller queries work with same connection 【发布时间】:2020-01-08 10:57:32 【问题描述】:我正在尝试从 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 中运行似乎需要大约相同的时间,但是它只会导致一个空字符向量
有人知道为什么会这样吗?
【问题讨论】:
【参考方案1】:更新:
删除临时表似乎导致查询再次工作,这很奇怪,因为我可以发誓它昨天工作正常。
我正在使用的新脚本(不太确定缩进发生了什么)是:
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]
")
【讨论】:
以上是关于带有临时表的 RODBC::sqlQuery 提供空字符向量,尽管查询在 SSMS 中工作,较小的查询在相同的连接下工作的主要内容,如果未能解决你的问题,请参考以下文章