RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?

Posted

技术标签:

【中文标题】RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?【英文标题】:RODBC::sqlSave() creating table, Warning: truncated to 255 bytes in column? 【发布时间】:2017-07-20 20:29:59 【问题描述】:

我正在使用RODBC 尝试将新表(本地数据框)写入 Oracle 数据库。我正在处理的问题是许多字段都是字符变量,长度超过 255 个字符。根据RODBC 小插图,我运行此代码来初始化表:

sqlSave(channel=conn, dat=SCHEMA.TABLE_NAME)

其中conn 是使用odbcConnect 设置的R 对象,SCHEMA.TABLE_NAME 是本地数据框的名称。 R返回警告信息,都说是这样

…在列中被截断为 255 个字节…

RODBC 小插图提到许多系统默认使用 varchar(255) 字符。但是,当我在 conn 对象上调用 sqlTypeInfo() 时,它说 varchar2COLUMN_SIZE 为 4000。

如何在不截断字符串的情况下将此数据帧作为表写入数据库?我相信我可以使用sqlQuery 编写 SQL 查询来手动创建此表,但我大约有 175 列,并且不想为每一列都写出信息。

【问题讨论】:

【参考方案1】:

使用 RODBC 中的 sqlSave 函数将数据框写入 sql server db 时,我遇到了同样的问题。

通过在运行 sqlSave 命令之前设置列类型以获取更多数据来解决。我使用了 varchar(500) 并且成功了。

如果您从 R 创建一个表,其中包含一个包含长字符串的单列,这对我有用:

    sqlQuery<-c('CREATE TABLE YourTable (ColumnName varchar(500));')
    channel <- odbcConnect("YourTable")
    sqlQuery(channel, paste(sqlQuery))
    close(channel) 

之后使用 sqlSave 写入该表应该可以工作:

    sqlSave(odbcConnect("YourTable"),dataFrame,append=TRUE)

如果您仍然收到截断警告,请尝试将 varchar 值设置为大于 500

【讨论】:

如果我的表有 300 个变量怎么办?使用这种方法,我是否需要指定每一列? 嗯听起来很痛苦。如何尝试使用 sqlQuery 【参考方案2】:
sqlsave(channel=conn, dat=SCHEMA.TABLE_NAME, varTypes=c(column_name="varchar(500)"))

虽然我不确定让 c(column_name="varchar(500)") 填满所有相关列的最简单方法是什么

【讨论】:

以上是关于RODBC::sqlSave() 创建表,警告:在列中截断为 255 个字节?的主要内容,如果未能解决你的问题,请参考以下文章

RODBC sqlSave() 和映射列名

RODBC sqlSave 列类型:如何确定?

RODBC sqlSave 崩溃 R 前端

当保存到 SQL Server 到 varchar(255) 时,RODBC::sqlsave() 会截断 DF 中的 col

plsql导入dmp文件时:IMP-00041:警告:创建的对象有编译警告

Big Query 不允许创建表