RODBC 命令 'sqlQuery' 在 t-SQL 中的 table 变量有问题

RODBC command 'sqlQuery' has problems with table variables in t-SQL

我正在使用我在 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

到目前为止,一切都很好。

但是,如果我尝试向 table 变量写入一条记录并执行

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 接口有问题 return 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
"

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

由于数据库服务器正确处理查询,将多行操作 TSQL 查询保存为 SQL 服务器存储过程,并让 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");