dBWriteTable无法将NULL写入SQL Server表

时间:2018-07-30 17:00:00

标签: r sql-server rjdbc

问题

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

STEPS

  1. 将表从SQL Server读取到R data.frame中。该表为十进制,带有一些NULL。 data.frame是带有一些NA的数字。
  2. dBWriteTable引发以下错误

      

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

  3. 我用0覆盖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 

1 个答案:

答案 0 :(得分: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

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