簡體   English   中英

如何使用 R 代碼創建或更改 SQL 視圖?

[英]How can I create or alter SQL view using R code?

是否可以使用 R 代碼創建或更改 SQL 視圖?

我正在使用 SQL 服務器,到目前為止,我還沒有找到任何使用 R 代碼的方法。 我希望在 dbplyr 中有一個解決方案,但我什么也沒找到。

我的目標是將多個表綁定在一起,所以沒什么復雜的。

在我看來,目前唯一的選擇是使用 SQL 代碼,例如:

DBI::dbExecute(conn, 
    CREATE OR ALTER VIEW dbo.MyTestView
AS  
    SELECT
        ColA, ColB, ColC, GETDATE() AS CurrentTimeStamp  
    FROM 
        dbo.MyTable1 

    UNION ALL  

    SELECT 
        ColA, ColB, ColC, GETDATE() AS CurrentTimeStamp  
    FROM
        dbo.MyTable2 

    UNION ALL  

    SELECT 
        ColA, ColB, ColC, GETDATE() AS CurrentTimeStamp
    FROM 
        dbo.MyTable3;
)

有什么建議么?

您不能直接創建視圖,但可以使用以下方式創建查詢本身:

library(dplyr)
# library(dbplyr)
union_all(
  tbl(con, "MyTable1") %>%
    select(ColA, ColB, ColC) %>%
    mutate(CurrentTimeStamp = today()),
  tbl(con, "MyTable2") %>%
    select(ColA, ColB, ColC) %>%
    mutate(CurrentTimeStamp = today())
  ) %>%
  show_query()
# <SQL>
# (SELECT TOP 1 "ColA", "ColB", "ColC", CAST(SYSDATETIME() AS DATE) AS "CurrentTimeStamp"
# FROM "MyTable1")
# UNION ALL
# (SELECT TOP 1 "ColA", "ColB", "ColC", CAST(SYSDATETIME() AS DATE) AS "CurrentTimeStamp"
# FROM "MyTable2")

人們總是可以捕獲這個 output ( %>% capture.output ) 並用您的CREATE OR...替換前導<SQL> ,然后調用dbExecute發送創建語句。

... %>%
  capture.output() %>%
  `[<-`(1, "CREATE OR ALTER VIEW dbo.MyTestView") %>%
  paste(collapse = " \n ") -> viewquery
DBI::dbExecute(con, viewquery)

我使用混合了 dbplyr 和 DBI 包的自定義 function 來執行此操作。 此 function 的精簡版如下所示。 您可以在此處找到完整的 function 以及其他助手。

create_view <- function(tbl_name, db_connection, view_name) {
  # SQL query
  sql_query <- glue::glue(
    "CREATE VIEW {view_name} AS\n",
    "{dbplyr::sql_render(tbl_name)}\n"
  )

  # run query
  result <- DBI::dbExecute(db_connection, as.character(sql_query))
}

這個 function 的想法是使用 dplyr 命令創建所需的表,然后再將其寫入視圖。 例如:

db_con = DBI::dbConnect(...)

input_table = tbl(db_con, "my table")

prepared_table = input_table %>%
  mutate(new_col = ...) %>%
  filter(old_col != ...)

create_view(prepared_table, db_con, "my_view")

prepared_view = tbl(db_con, "my_view")

請注意,您的數據庫連接需要與您將要寫入視圖的數據庫連接。 您不能將視圖寫入不同的數據庫。

我不知道UNION ALL的任何 dbplyr 方法。 我也使用自定義 function 來執行此操作,類似於以下內容。

union_all <- function(db_con, table_a, table_b, list_of_columns) {
  table_a <- table_a %>% dplyr::ungroup() %>% dplyr::select(all_of(list_of_columns))
  table_b <- table_b %>% dplyr::ungroup() %>% dplyr::select(all_of(list_of_columns))

  sql_query <- dbplyr::build_sql(
    con = db_con,
    dbplyr::sql_render(table_a),
    "\nUNION ALL\n",
    dbplyr::sql_render(table_b)
  )
  return(dplyr::tbl(db_connection, dbplyr::sql(sql_query)))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM