我正在使用我在 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/

10-12 17:55