RODB C с использованием EXE C @variable - PullRequest
0 голосов
/ 01 апреля 2020

Я работаю с группой баз данных с несколькими проектами одинаковой структуры в каждой базе данных. Моя цель состоит в том, чтобы запрашивать основную базу данных на каждом сервере и извлекать одинаковую информацию из всех проектов для агрегирования и выполнения анализа. На сервере SQL я собрал рабочий запрос (пример ниже), который перебирает все проекты, возвращающие одну и ту же информацию:

Declare @DBNames Table (RN int, Name varchar(max))
Insert Into @DBNames (RN, Name)
Select Row_Number() Over (Order By Name Desc) as RN, 
        Name 
From sys.databases 
Where  (Name = 'proj1' or
        Name = 'proj2' or
        Name = 'proj3')
    and state_desc = 'Online'

-- sql part 1a
DECLARE @sql1 varchar(max) = 
                                 '
select  ''a.colA
        ,b.colB
        ,c.colC

from '

-- sql2 part 
Declare @SQL2 varchar(max) = '.dbo.tableA as a
    inner join '

-- sql3 part 
Declare @SQL3 varchar(max) = '.dbo.tableB as b on b.x = a.x
    inner join '

-- sql4 part 
Declare @SQL4 varchar(max) = '.dbo.tableC as c on c.y = b.y
where col1 is not null' 

Declare @SQL varchar(max)
Select @SQL = (
                                 Select Stuff((@SQL1 + Name + @SQL2 +  NAME + @SQL3 + Name + @SQL4 + Case When RN = 1 Then '' Else ' Union ' End), 1, 0, '') as SQL
                                 From @DBNames Order By RN Desc
                                 for XML Path(''), TYPE).value('.','varchar(max)')

                               exec(@sql)

Когда я пытаюсь загрузить данные с помощью вышеуказанного запроса в RODB C, похоже, не работает. Поддерживает ли RODB C этот тип запроса? Если нет, что может быть хорошей альтернативой?

Заранее благодарим вас за ваше время и терпение!

1 Ответ

2 голосов
/ 01 апреля 2020

По сути, вы строите динамический c запрос в T SQL, используя процедурную семантику. Но R - это процедурный язык. Следовательно, рассмотрите возможность обхода баз данных для создания объединенного фрейма данных (аналог UNION).

library(RODBC) 

sql <- "select a.colA, b.colB, c.colC 
        from dbo.tableA as a 
        inner join dbo.tableB as b on b.x = a.x 
        inner join dbo.tableC as c on c.y = b.y 
        where col1 is not null"

get_db_data <- function(db) {
     # DYNAMICAL DATABASE CONNECTION
     conn <- odbcDriverConnect(paste0("Driver={SQL Server};",
                                      "Server=myserver;Database=", db,
                                      ";Trusted_connection=Yes"))

     df <- sqlQuery(conn, sql)

     odbcClose(conn)

     return(df)
}

# BUILD LIST OF DFs FROM DIFFERENT DBs
df_list <- lapply(c("proj1", "proj2", "proj3"), get_db_data)

# EQUIVALENT TO UNION QUERY
final_df <- unique(do.call(rbind, df_list))
...