r-dBWriteTable无法将NULL写入SQL Server表



ISSUE

无法将数据帧中的NA值插入数据库表

步骤

  1. 将表从SQL server读取到Rdata.frame中。表是十进制的,带有一些NULL。data.frame是带有一些NA的数字。

  2. dBWriteTable抛出以下错误

    .local(conn,statement,…(中的错误:在dbSendUpdate中执行JDBC更新查询失败(传入的表格格式数据流(TDS(远程过程调用(RPC(协议流不正确。参数57("(:提供的值不是数据类型float的有效实例。请检查源数据中的无效值。无效值的示例是小数位数大于精度的数字类型的数据。(

  3. 我用类似dataset$column[is.na(dataset$column)] = 0的0s覆盖NA

  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 

出现问题的原因是,对于未具体定义的值,R中有三个(可能更多(不同的值。它是"Inf"、"NaN"或"NA"。现在,dbWriteTable可以通过在将NA移到SQL时将其转换为"NULL"来处理NA。但是,无法识别"NaN"one_answers"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

如果你需要更多信息,请联系我。

相关内容

  • 没有找到相关文章

最新更新