RODBC 游标查询
RODBC Cursor Queries
我是 R 的新手 - 但我希望在 SQL 服务器上跨多个数据库执行 SQL 服务器游标查询并将结果存储在数据框中 - 我已连接到服务器并且我有一个单独的文件 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)
)
但我没有得到任何结果 - 关于如何执行此操作的任何想法或建议?
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)
SET NOCOUNT ON 在批次的开头。在 DML 语句之后发送的行计数消息必须由客户端在读取结果集之前进行处理。 SET NOCOUNT ON 禁止显示这些消息,因此客户端通常无法区分单语句 SELECT 批处理和将单个 SELECT 作为语句之一的多语句批处理之间的区别。
我是 R 的新手 - 但我希望在 SQL 服务器上跨多个数据库执行 SQL 服务器游标查询并将结果存储在数据框中 - 我已连接到服务器并且我有一个单独的文件 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)
)
但我没有得到任何结果 - 关于如何执行此操作的任何想法或建议?
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)
SET NOCOUNT ON 在批次的开头。在 DML 语句之后发送的行计数消息必须由客户端在读取结果集之前进行处理。 SET NOCOUNT ON 禁止显示这些消息,因此客户端通常无法区分单语句 SELECT 批处理和将单个 SELECT 作为语句之一的多语句批处理之间的区别。