我正在使用我在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控制台。
有人知道如何解决这个问题吗?
答案 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");