带有临时表的 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 中工作,较小的查询在相同的连接下工作的主要内容,如果未能解决你的问题,请参考以下文章

RODBC 连接无效

RODBC sqlQuery() 在应该返回 varchar(MAX) 时返回 varchar(255)

RODBC sqlQuery as.is 返回错误结果

RODBC:积极转换字符和数字(有/无原样)

带有临时表的slave停止stop或者修改表结构

postgres - 使用提供临时表的函数创建视图