如何正确使用sqlAppendTable?

Wil*_*lem 5 odbc r insert r-dbi

简短的摘要

我正在尝试使用该包将 R data.frame 中的数据插入 SQLServer 数据库上的表中DBI。在阅读了有关 sqlAppendTable 的信息后,我希望这个函数可以帮助我生成必要的 SQL 语句。然而,这个函数似乎没有将字符串放在字符变量周围,因此在尝试执行它时会产生错误。我使用正确吗?我应该为此目的使用此功能吗?如果没有,您能推荐另一种方法吗?

我的代码

library(odbc)
library(DBI)

con <- dbConnect(
    odbc::odbc(),
    dsn      = myDsn,
    UID      = myLogin,
    PWD      = myPwd,
    Port     = 1433,
    encoding = "latin1"
  )

insertStatement <- sqlAppendTable(
    con,
    "DBtable",
    myDataFrame,
    row.names = FALSE
  )

dbExecute(
  con,
  insertStatement
)

dbDisconnect(con)
Run Code Online (Sandbox Code Playgroud)

数据库表“DBtable”有 3 列,每列的类型为varchar。data.frame“myDataFrame”也有 3 列类型,character具有相同的名称和相同的顺序。

问题

sqlAppendTable生成一个 SQL 语句,其中字符变量不带引号,即以下形式的输出:

<SQL> INSERT INTO "DBtable"
  ("col1", "col2", "col3")
VALUES
  (Value one one, Value one two, Value one three),
  (Value two one, Value two two, Value two three),
  etc.
Run Code Online (Sandbox Code Playgroud)

当在语句中使用此输出时dbExecute,它会生成错误,因为这些值未加引号,即Value one one, ...而不是'Value one one', ...

我的问题

  • 有没有办法让这个函数在字符变量周围加上引号?如果是这样,怎么办?
  • 我可以为此目的使用此功能吗?(该信息表明它“对后端实现者最有用”,无论这意味着什么。)
  • 如果我不能,还有其他功能可以使用吗?我宁愿避免使用paste(或类似的函数)创建自定义语句,因为这很乏味,容易出错,并且不容易为不同的表复制。

小智 2

我遇到了同样的问题,但随后创建了一个小辅助函数,该函数将 data.frame 作为输入并引用其中的每个值:

sQuote.df <- function(df) {
    for (c in 1:ncol(df)) df[,c] <- sQuote(gsub("'", "`", df[,c]))
    df
}
Run Code Online (Sandbox Code Playgroud)

(请注意,这里的 gsub 函数用于将 data.frame 中潜在的单引号更改为后向撇号)

在 sqlAppendTable 中使用它,例如

sqlAppendTable(connection, "table", sQuote.df(df_to_insert), row.names=F)
Run Code Online (Sandbox Code Playgroud)

使该功能对我来说非常方便和有用。