我对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)
)
但我没有得到任何结果-任何想法或建议如何做到这一点?
2条答案
按热度按时间yhqotfr81#
rodbc查询每个查询只支持一条sql语句
sqlQuery
打电话。您尝试的过程查询包含多个语句。另外,您正在运行带有循环的动态sql,没有temp表,r可以为您做两件事。考虑检索所有数据库名称,然后对聚合查询遍历每个数据库名称。注意使用句点限定符从同一服务器上的其他数据库进行查询。最后,将所有对象连接到最终的单个Dataframe对象。
xurqigkl2#
在批处理开始时设置nocount。在dml语句之后发送的rowcount消息必须由客户端在读取结果集之前进行处理。SETNOCOUNT on会抑制这些消息,因此客户端通常无法区分单语句select批处理与单语句select作为其中一个语句的多语句批处理之间的区别。