rodbc游标查询

zsohkypk  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(333)

我对r不熟悉-但我希望在sql server上的多个数据库上执行sql server游标查询,并将结果存储在数据框中-我已连接到服务器,并且我有一个单独的sql server文件-
sql(cursor\u 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)
  )

但我没有得到任何结果-任何想法或建议如何做到这一点?

yhqotfr8

yhqotfr81#

rodbc查询每个查询只支持一条sql语句 sqlQuery 打电话。您尝试的过程查询包含多个语句。另外,您正在运行带有循环的动态sql,没有temp表,r可以为您做两件事。
考虑检索所有数据库名称,然后对聚合查询遍历每个数据库名称。注意使用句点限定符从同一服务器上的其他数据库进行查询。最后,将所有对象连接到最终的单个Dataframe对象。

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)
xurqigkl

xurqigkl2#

在批处理开始时设置nocount。在dml语句之后发送的rowcount消息必须由客户端在读取结果集之前进行处理。SETNOCOUNT on会抑制这些消息,因此客户端通常无法区分单语句select批处理与单语句select作为其中一个语句的多语句批处理之间的区别。

相关问题