我正在使用我在 Microsoft SQL Server 2012 上应用的 RODBC 包。
现在我发现了一个令我困惑的现象。
如果我使用 RODBC 命令 sqlQuery 运行以下查询,那么在 R 中,我将返回一个包含 Country、CID、PriceID 和 WindID 列的空数据框。
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
)
SELECT * FROM @tbl_Ids
到目前为止,一切都很好。
但是,如果我尝试将记录写入表变量并执行
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
)
INSERT INTO @tbl_IDs
VALUES
('Germany', 'DE', 112000001, 256000002);
SELECT * FROM @tbl_Ids
然后,在 R 中,结果将是一个空字符,而不是一个只有一条记录的数据帧。相同的查询仍然可以与 SQL Server Management Studio 完美配合。
此外,我们还跟踪了执行 R-Query 时 DB 服务器的行为,并且服务器似乎完美地处理了它。好像是RODBC接口(interface)有问题,无法将结果返回到R控制台。
有没有人知道如何解决这个问题?
最佳答案
尝试切换 NOCOUNT
如下:
old_qry <- "
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
)
INSERT INTO @tbl_IDs
VALUES
('Germany', 'DE', 112000001, 256000002);
SELECT * FROM @tbl_Ids
"
##
new_qry <- "
SET NOCOUNT ON;
DECLARE @tbl_IDs TABLE
(
Country nvarchar(30),
CID nvarchar(5),
PriceID int,
WindID int
);
INSERT INTO @tbl_IDs
VALUES
('Germany', 'DE', 112000001, 256000002);
SET NOCOUNT OFF;
SELECT * FROM @tbl_Ids
"
R> sqlQuery(tcon, gsub("\\n", " ", old_qry))
#character(0)
R> sqlQuery(tcon, gsub("\\n", " ", new_qry))
# Country CID PriceID WindID
#1 Germany DE 112000001 256000002
基本上,您希望在代码的开头使用
SET NOCOUNT ON
,而在最终 SET NOCOUNT OFF
语句之前使用 SELECT
。关于RODBC 命令 'sqlQuery' 在 t-SQL 中存在表变量问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33396013/