我这样做使用dbExecute
来自DBI
包裹。
关键思想是提取定义当前远程表的查询,并将其作为写入该表的较大 SQL 查询中的子查询。这要求 (1) 架构存在,(2) 您有权编写新表,并且 (3) 您知道正确的 SQL 语法。
直接这样做可能看起来像:
tbl(conn, "temp")
temp_ed <- temp %*% mutate(new = 1)
save_table_query = paste(
"SELECT * INTO my_database.schema_new.my_table FROM (\n",
dbplyr::sql_render(temp_ed),
"\n) AS sub_query"
)
dbExecute(conn, as.character(save_table_query))
INTO
是在 SQL Server 中写入新表的子句(我使用的 SQL 风格)。您将需要为您的数据库找到等效的子句。
在实践中,我使用一个自定义函数,如下所示:
write_to_database <- function(input_tbl, db, schema, tbl_name){
# connection
tbl_connection <- input_tbl$src$con
# SQL query
sql_query <- glue::glue(
"SELECT *\n",
"INTO {db}.{schema}.{tbl_name}\n",
"FROM (\n",
dbplyr::sql_render(input_tbl),
"\n) AS sub_query"
)
result <- dbExecute(tbl_connection, as.character(sql_query))
}
将其应用到您的环境中:
tbl(conn, "temp")
temp_ed <- temp %*% mutate(new = 1)
write_to_database(temp_ed, "my_database", "schema_new", "my_table")