RODBC 游标查询

Posted

技术标签:

【中文标题】RODBC 游标查询【英文标题】:RODBC Cursor Queries 【发布时间】:2020-06-06 16:39:15 【问题描述】:

我是 R 新手 - 但我希望在 SQL Server 上的多个数据库中执行 SQL Server 游标查询并将结果存储在数据框中 - 我已连接到服务器,并且我有一个单独的文件,其中包含 SQL -

SQL (cursor_query.sql) -

CREATE TABLE #tempRPT
(date DATE, 
 number  INT,
 type nvarchar(255)
);
DECLARE @sql NVARCHAR(4000);
DECLARE @DBNAME NVARCHAR(255);
DECLARE dbcursor CURSOR STATIC
FOR SELECT [name]
    FROM sysdatabases; 
OPEN dbcursor;
FETCH NEXT FROM dbcursor INTO @DBNAME;
WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @sql = 'USE  ['+@DBNAME+']; 
        select
cast(startdatetime as date),
count(*),
''bookings''
from bookings
group by cast(startdatetime as date);'
        INSERT INTO #tempRPT
        EXEC (@sql);
        FETCH NEXT FROM dbcursor INTO @DBNAME;
    END;
CLOSE dbcursor;
DEALLOCATE dbcursor;
SELECT *
FROM #tempRPT;
DROP TABLE #tempRPT;

我正在尝试使用以下内容将其读入 R -

Results <-
  sqlQuery(
    odbcConnect(dsn = "Database", uid = "***", pwd = "***"),
    query = readLines("cursor_query.sql", warn=FALSE)
  )

但我没有得到任何结果 - 关于如何执行此操作的任何想法或建议?

【问题讨论】:

首先尝试一个简单的选择查询。如果可行,请尝试在查询中使用永久表并查看。 【参考方案1】:

RODBC 查询在每个sqlQuery 调用中仅支持一条 SQL 语句。您尝试的程序查询由多个语句组成。此外,您正在使用循环运行动态 SQL,R 可以在没有临时表的情况下为您做两件事。

考虑检索所有数据库名称,然后遍历每个数据库名称以进行聚合查询。请注意使用周期限定符从同一服务器上的其他数据库进行查询。最后,将所有内容连接到最终的单个数据框对象。

conn <- odbcConnect(dsn = "Database", uid = "***", pwd = "***")

db_names <- sqlQuery(conn, "SELECT [name] FROM sysdatabases")

df_list <- lapply(db_names$name, function(db) 
         sqlQuery(conn, paste0("select
                                  cast(startdatetime as date) as start_date,
                                  count(*) as [count],
                                  'bookings' as [indicator]
                                from [", db, "]..bookings
                                group by cast(startdatetime as date)")
         )
)

final_df <- do.call(rbind.data.frame, df_list)

odbcClose(conn)

【讨论】:

谢谢 - 当我在少数几个数据库中运行它时,这是有效的,但是当我尝试在所有数据库中运行它时它完成但似乎没有返回任何结果 - 有什么建议吗? 查看将向量dbnames$name 传递到lapply 而不是整个数据帧的轻微编辑。另外,所有数据库表都使用dbo 模式吗?具体来说,传递任何错误并描述df_list 和/或final_df 是否为空。【参考方案2】:

SET NOCOUNT ON 在批处理的开头。在 DML 语句之后发送的行计数消息必须由客户端在读取结果集之前进行处理。 SET NOCOUNT ON 会抑制这些消息,因此客户端通常无法区分单语句 SELECT 批处理和以单个 SELECT 作为语句之一的多语句批处理。

【讨论】:

以上是关于RODBC 游标查询的主要内容,如果未能解决你的问题,请参考以下文章

查询在 SQL Server 中工作,但在 RODBC 中不工作

RODBC:执行包含多个语句的查询

如何在 R 中使用 RODBC 在 MS Access 中执行查询?

RODBC 查询不返回数据

SQL Server 查询因 RODBC 连接而失败,在 SQL Server 中工作

RODBC posixct 日期字段使查询非常慢