RODBC命令“sqlQuery”与t-SQL中的表变量有关

RODBC命令“sqlQuery”与t-SQL中的表变量有关,r,tsql,rodbc,table-variable,R,Tsql,Rodbc,Table Variable,我正在使用RODBC包,我正在Microsoft SQL Server 2012上应用该包 现在我发现了一个让我困惑的现象 如果我使用RODBC命令sqlQuery运行以下查询,那么在R中,我将返回一个包含Country、CID、PriceID和WindID列的空数据帧 DECLARE @tbl_IDs TABLE ( Country nvarchar(30), CID nvarchar(5), PriceID int, WindID int ) SELECT

我正在使用RODBC包,我正在Microsoft SQL Server 2012上应用该包

现在我发现了一个让我困惑的现象

如果我使用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中,结果将是一个空字符,而不是只有一条记录的数据帧。同样的查询在SQLServerManagementStudio中仍然可以完美地工作。 此外,我们还跟踪了执行R-Query时DB服务器的行为,似乎服务器能够完美地处理它。RODBC接口似乎在将结果返回到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
"

基本上,您希望在代码开始时启用NOCOUNT,并在最终SELECT语句之前禁用NOCOUNT

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

请注意,您甚至可以将EXEC sp行中的参数从R传递到MSSQL。同样如前所述,在查询中包括SET NOCOUNT ON声明以避免不需要的结果字符0:


尝试将表变量更改为临时表。创建表tbl_id Country nvarchar30、CID nvarchar5、PriceID int、WindID int;在tbl_ID值中插入“德国”、“德”、112000001、256000002;从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
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");