5

我正在使用我在 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 接口有问题将结果返回到 R 控制台。

有谁知道如何解决这个问题?

4

2 回答 2

9

尝试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语句之前。

于 2015-10-28T16:22:34.780 回答
1

由于数据库服务器正确处理查询,将多行操作 TSQL 查询保存为 SQL Server 存储过程,并让 R 调用它来检索结果集。

请注意,您甚至可以将EXEC sp行中的参数从 R 传递到 MSSQL。同样如前所述,SET NOCOUNT ON在查询中包含声明以避免不希望的结果character(0)

library("RODBC");
conn <- odbcConnect("DSN Name",uid="***",pwd="***");   # WITH DSN
#conn <-odbcDriverConnect('driver={SQL Server};server=servername;database=databasename;
                        #trusted_connection=yes;UID=username;  PWD=password')  # WITH DRIVER

df<-sqlQuery(conn, "EXEC dbo.StoredProcName");
于 2015-10-28T17:23:27.863 回答