【问题标题】:dBWriteTable cannot write NULLs into SQL Server tabledBWriteTable 无法将 NULL 写入 SQL Server 表
【发布时间】:2018-07-30 16:59:59
【问题描述】:

问题

无法将 NA 值从 data.frame 插入到数据库表中

步骤

  1. 将表从 SQL 服务器读入 R data.frame。表格是十进制的,带有一些NULL。 data.frame 是带有一些NA 的数字。

  2. dBWriteTable 抛出以下错误

    Error in .local(conn, statement, ...) : execute JDBC update query failed in dbSendUpdate (传入的表格数据流 (TDS) 远程过程调用 (RPC) 协议流不正确。参数 57 ("") : 提供的值不是浮点数据类型的有效实例。请检查源数据中的无效值。无效值的示例是小数位数大于精度的数字类型数据。)

  3. 我用 0 覆盖 NA,例如 dataset$column[is.na(dataset$column)] = 0

  4. dBWriteTable 成功写入数据库

R 详细信息

> sessionInfo()
R version 3.4.4 (2018-03-15)
Platform: x86_64-redhat-linux-gnu (64-bit)
Running under: Red Hat Enterprise Linux Server 7.5 (Maipo)

RJDBC_0.2-7.1       rJava_0.9-10       DBI_1.0.0 

【问题讨论】:

  • 是否已将基础表配置为允许空值?
  • 这是一个有趣的错误,如果您可以设置可重现的示例,请将问题发布到 rjdbc git page。如果您可以下载SQL Server ODBC driver 并使用odbc 包(也使用DBI),那么您是否可以使用NA 重新创建dbWriteTable() 错误会很有趣。
  • @Parfait:只是忘了提一下,如果我将RODBCsqlSave 一起使用,一切都会顺利进行,但速度会慢很多!无论如何,感谢您指出 git 页面,那里有一个与我的相同问题的人LINK。恢复到旧版本的包可以解决问题,但现在执行时间更糟:0.2-7 0.97'' vs 0.2-5 39.8''。我认为-7 他们引入了批量插入。
  • 请注意:odbcRODBC 不同。但是,两者都使用 ODBC 驱动程序。使用 DBI 投诉库可能会更好。
  • @Parfait 我什至尝试过odbc,但从性能的角度来看结果是一样的。非常感谢您的支持。

标签: r sql-server rjdbc


【解决方案1】:

出现问题是因为 R 中有三个(可能更多)不同的值用于未具体定义的值。它是“Inf”、“NaN”或“NA”。现在 dbWriteTable 可以通过在将其移动到 SQL 时将其转换为“NULL”来处理 NA。但是“NaN”和“Inf”无法识别,因此会出现“检查源数据是否存在无效值”错误。修复方法如下:

假设这是您要写入 SQL 的表:

Tablename: "df"
USER quality
1    Inf
2    NaN
3    0.3

您要做的第一件事是将所有“NaN”转换为“NA”,因为 dbWriteTable 可以识别这些。这可以通过以下方式完成:

df[is.na(df)] <- NA

那么你仍然有你的“Inf”值。不幸的是,我还没有找到一种简单的方法来一行浏览整个表格。但是检查哪些列有“Inf”,并按照以下方式一一进行:

df$quality[is.nan(df$quality)] <- NA

如果您的表已清理,则不应出现这些错误。这是另一个如何使用 dbWriteTable 的示例,只是为了让事情更清楚:

dbWriteTable(ODBCconnectionname, DBMStablename, YourRtablename,
field.types = c(USER="integer",
quality="float(53)",
))

在此页面上检查您需要哪些数据类型: https://www.w3schools.com/sql/sql_datatypes.asp

如果您需要更多信息,请私信我。

【讨论】:

  • 这个最小的例子不起作用:x &lt;- data.frame(a=c(1.1,NA_real_)); dbWriteTable(db_conn, "test_tbl", x)
  • 这里有is.infinite 可以检查NaNInf,仅供参考和未来访问者使用。
猜你喜欢
  • 2018-03-12
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多