5

简短的摘要

我正在尝试使用包将 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)

数据库表“DBtable”有 3 列,每列都有 type 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.

当在语句中使用此输出时dbExecute,它会生成错误,因为值没有被引用,即,Value one one, ...而不是'Value one one', ....

我的问题

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

2 回答 2

2

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

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

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

在 sqlAppendTable 中使用它

sqlAppendTable(connection, "table", sQuote.df(df_to_insert), row.names=F)

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

于 2019-04-07T08:06:35.273 回答
-1

dbQuoteString() 函数应该有帮助:

# Quoting ensures that arbitrary input is safe for use in a query
name <- "Robert'); DROP TABLE Students;--"
dbQuoteString(ANSI(), name)

# NAs become NULL
dbQuoteString(ANSI(), c("x", NA))

# SQL vectors are always passed through as is
var_name <- SQL("select")
var_name
dbQuoteString(ANSI(), var_name)

# This mechanism is used to prevent double escaping
dbQuoteString(ANSI(), dbQuoteString(ANSI(), name))

来源:http ://web.mit.edu/~r/current/arch/i386_linux26/lib/R/library/DBI/html/dbQuoteString.html

于 2020-04-29T13:35:28.137 回答