R使用RODBC包sqlSave函数向SQL数据库写入数据失败问题求助
解决方案
- 补全表名的schema前缀并禁用行号写入
SQL Server的表默认归属dboschema,仅指定表名SQL_table时RODBC的表存在性校验可能无法正确匹配已创建的表,同时sqlSave默认会将R数据框的行号作为独立字段写入,你目标表未设计该字段的情况下,字段数量不匹配也会触发建表逻辑(对应报错CREATE TABLE语句中的rownames字段),修改代码如下:
RODBC::sqlSave(channel=con , dat=my_df, tablename = "dbo.SQL_table", append=T, rownames = FALSE)
- 关闭额外校验规则
如果补全schema后仍报错,可以追加safer = FALSE参数,关闭RODBC默认的严格存在性校验:
RODBC::sqlSave(channel=con , dat=my_df, tablename = "dbo.SQL_table", append=T, rownames = FALSE, safer = FALSE)
- 更换稳定读写方案
RODBC包已停止维护多年,对新版SQL Server兼容性问题较多,建议切换为官方维护的odbc+DBI包组合完成写入,示例代码如下:
library(DBI) library(odbc) # 建立连接 con <- dbConnect(odbc(), DSN = "SQL_Database", UID = "my_user_name", PWD = "my_password") # 写入数据 dbWriteTable(con, name = Id(schema = "dbo", table = "SQL_table"), value = my_df, append = TRUE, row.names = FALSE) # 关闭连接 dbDisconnect(con)
该方案的表匹配逻辑更准确,不会出现表存在却触发建表的异常。
内容的提问来源于stack exchange,提问作者HSpeckman
相关产品推荐
相关产品推荐

