r - 从 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_name
andsubq.obj_dt
字段来修改上面的查询,#B
那么代码会成功返回预期的数据集
obj_id
1 1
2 2
3 2
来自 R。
那么这里发生了什么?两个 sql 查询都是有效的,并且在 Microsoft SQL 服务器环境中成功运行,但只有一个在通过 R 管道时有效。我不知道是什么原因导致 RODBC 代码无法处理第二个查询。
解决方案
这是一个关于本地临时表(#mytable
not ##mytable
)的已知问题,不仅在 R 中,而且在 SSMS 等 Microsoft 工具中对临时表的所有外部调用(参见下面第一个链接的评论)。
看看那些链接:
- https://github.com/r-dbi/odbc/issues/127特别是https://github.com/r-dbi/odbc/issues/127#issuecomment-396343426
- 连接到 MS SQL Server 时出现 RODBC 临时表问题
在阅读了这些链接之后,奇怪的是它在没有subq.obj_name
and的情况下确实可以工作subq.obj_dt
:也许它可以工作,因为查询是在一个唯一的调用中。
推荐阅读
- c# - 托管在 Azure 上的 ASP.NET Core 2.2 应用服务返回 500 且未引发异常
- java - 无法让测试方法与硒网格并行运行
- javascript - 从 React 前端调用 PHP Lumen 后端并解决 CORS 问题
- javascript - 如何在mongodb中查询一个数组
- java - 如何修复 javax.crypto.IllegalBlockSizeException?
- three.js - 在 ThreeJS 中更改相机位置距离
- c# - 如何在 asp.net web api 中读取 json 文件
- html - 如何保持位置:相对内容与我的位置重叠:粘性标题?
- postgresql - 在与 JSONB 冲突时使用批量插入/更新很慢
- python - 使用索引和更好的 SQL 在循环中优化 QuerySet