RODBC命令'sqlQuery'在t-SQL中存在表变量问题

时间:2015-10-28 16:06:29

标签: r tsql rodbc table-variable

我正在使用我在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时跟踪了数据库服务器的行为,服务器似乎完美地处理了它。似乎RODBC接口有问题将结果返回到R控制台。

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

2 个答案:

答案 0 :(得分:7)

尝试切换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

答案 1 :(得分: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");