简短摘要
我尝试使用DBI
包将R data.frame中的数据插入到SQLServer数据库的表中。在阅读information about 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)
数据库表&#34; DBtable&#34;有3列,每列都有varchar
类型。 data.frame&#34; myDataFrame&#34;还有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
(或类似的函数)创建自定义语句,因为这个单调乏味,容易出错,并且不容易为不同的表复制。答案 0 :(得分:1)
我遇到了同样的问题,但是随后创建了一个小的辅助函数,该函数将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)
使该功能非常方便并且对我有用。
答案 1 :(得分:-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