首页 > 解决方案 > 从 R 执行时 SQL Server 查询失败

问题描述

我有以下简单的 SQL 服务器代码:

set nocount on;
if OBJECT_ID('tempdb..#A') IS NOT NULL DROP TABLE #A;

set nocount on;
create table #A
( obj_id int,
  obj_name varchar(50),
  obj_dt   datetime);

  insert into #A (
  obj_id,
  obj_name,
  obj_dt)
  values
  ( 1
   ,'name'
   ,'2019-01-01 00:00:00'
  ),
  ( 2
   ,NULL
   ,NULL
  ),
  ( 2
   ,'alias'
   ,'2019-02-01 00:00:00'
  );

set nocount on;
if OBJECT_ID('tempdb..#B') IS NOT NULL DROP TABLE #B;

set nocount on;
select 
 #A.obj_id
,subq.obj_name
,subq.obj_dt
into #B 
from #A
join (select
        obj_id,
        max(obj_name) as obj_name,
        max(obj_dt) as obj_dt
      from #A
      group by obj_id) as subq
on #A.obj_id = subq.obj_id;

set nocount on;
select * from #B;

正如预期的那样,它在 Microsoft SQL Server Management Studio 中执行时返回以下数据:

obj_id  obj_name    obj_dt
1       name        2019-01-01 00:00:00.000
2       alias       2019-02-01 00:00:00.000
2       alias       2019-02-01 00:00:00.000

到目前为止,一切都很好。现在我希望从 R 运行此代码并将相同的输出返回到 R。我将上面的查询存储在字符串中query,并将我的RODBC连接存储在变量connection中,并尝试使用检索数据

sqlQuery(connection,query)

结果是character(0)但是,如果我通过注释掉定义中的subq.obj_nameandsubq.obj_dt字段来修改上面的查询,#B那么代码会成功返回预期的数据集

obj_id
1      1
2      2
3      2

来自 R。

那么这里发生了什么?两个 sql 查询都是有效的,并且在 Microsoft SQL 服务器环境中成功运行,但只有一个在通过 R 管道时有效。我不知道是什么原因导致 RODBC 代码无法处理第二个查询。

标签: rsql-serverrodbc

解决方案


这是一个关于本地临时表(#mytablenot ##mytable)的已知问题,不仅在 R 中,而且在 SSMS 等 Microsoft 工具中对临时表的所有外部调用(参见下面第一个链接的评论)。

看看那些链接:

在阅读了这些链接之后,奇怪的是它在没有subq.obj_nameand的情况下确实可以工作subq.obj_dt:也许它可以工作,因为查询是在一个唯一的调用中。


推荐阅读