【问题标题】:RODBC command 'sqlQuery' has problems with table variables in t-SQLRODBC 命令“sqlQuery”在 t-SQL 中存在表变量问题
【发布时间】:2016-01-28 12:27:54
【问题描述】:

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

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

【问题讨论】:

  • 尝试将表变量更改为临时表。 CREATE TABLE #tbl_IDs ( Country nvarchar(30), CID nvarchar(5), PriceID int, WindID int ); INSERT INTO #tbl_IDs VALUES ('Germany', 'DE', 112000001, 256000002); SELECT * FROM #tbl_Ids
  • 感谢您的回答,但这并没有解决问题。我们之前已经测试过了。

标签: r tsql rodbc table-variable


【解决方案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");

【讨论】:

  • 感谢您的回答,但对于我的数据库知识而言,您的解决方案有点过分。我无法测试它。
【解决方案2】:

尝试如下切换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语句之前。

【讨论】:

    猜你喜欢
    • 2014-07-09
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    相关资源
    最近更新 更多