RODBC命令“sqlQuery”与t-SQL中的表变量有关
我正在使用RODBC包,我正在Microsoft SQL Server 2012上应用该包 现在我发现了一个让我困惑的现象 如果我使用RODBC命令sqlQuery运行以下查询,那么在R中,我将返回一个包含Country、CID、PriceID和WindID列的空数据帧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
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");