使用RODBC sqlSave

时间:2019-06-13 16:19:17

标签: r teradata

这是一个运行了几个月的旧版R代码。我能够从R中读取/删除Teradata中的表,但无法从数据帧将数据写入表中。

我尝试过删除表,然后重新创建和写入不同的数据框。

sqlSave(ch, df, tablename = paste("scenario.table_storetype"),rownames=F)

我遇到以下错误

  

sqlColumns(channel,tablename)[4L] [,1L]中的错误:错误的数量   尺寸追溯:
  1. sqlSave(ch,df,tablename = paste(“ scenario.table_storetype”),。rownames = F,更安全= FALSE,append = T)
  2. sqlwrite(channel,tablename,dat,verbose = verbose,fast = fast,。test = test,nastring = nastring)

dput(head(df))

输出: 结构(列表(预测= c(36659805.75,28117111.75,27005618.75, 33650734.4166667、27243750.75、26907919.0833333),实际= c(38293943, 29892143、27016674、33524728、27252399、26521098),BC = c(“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”),期间= 201904:201909,方式= c(“ a_tslm_mape”, “ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape” ))。.names = c(“ forecast”,“ actual”,“ BC”,“ period”,“ how”),row.names = c(NA, 6L),类=“ data.frame”)

dput(head(df))

四舍五入后-输出: 结构(列表(预测= c(36659805.75,28117111.75,27005618.75, 33650734.42、27243750.75、26907919.08),实际= c(38293943, 29892143、27016674、33524728、27252399、26521098),BC = c(“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”,“准备好的沙拉,水果和蔬菜”, “准备好的沙拉,水果和蔬菜”),期间= 201904:201909,方式= c(“ a_tslm_mape”, “ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape”,“ a_tslm_mape” ))。.names = c(“ forecast”,“ actual”,“ BC”,“ period”,“ how”),row.names = c(NA, 6L),类=“ data.frame”)

1 个答案:

答案 0 :(得分:0)

显然,您有非常大的数字,且精度不同。动态创建表时,数字字段可能会映射为DECIMAL(n, m)类型,其中第2个小数位数可能由第一个值36659805.75设置,但后来与33650734.4166667的小数位数冲突7。

考虑使用sqlSave varTypes 参数来显式定义数据类型。根据文档:

  

varTypes::一个可选的命名字符向量,如果要创建表,该向量将提供用于某些(或全部)列的DBMS数据类型

此外,在R中进行相应的舍入以符合Teradata列类型的精度要求

df$forecast <- round(df$forecast, 4)           # PRECISION OF 4

max(nchar(df$BC))                              # FIND MAX CHARS
max(nchar(df$how))                             # FIND MAX CHARS

tbl_types = c(forecast = "DECIMAL(12, 4)",
              actual = "DECIMAL(12, 4)",
              BC = "VARCHAR(50)",
              period = "INTEGER",
              how = "VARCHAR(20)")

sqlSave(ch, df, tablename = paste("scenario.table_storetype"), 
        varTypes = tbl_types, rownames = FALSE)