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

标签 r sql-server rjdbc

问题

无法将 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 (The incoming tabular data stream (TDS) remote procedure call (RPC) protocol stream is incorrect. Parameter 57 (""): The supplied value is not a valid instance of data type float. Check the source data for invalid values. An example of an invalid value is data of numeric type with scale greater than precision.)

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

  4. dBWriteTable成功写入DB

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 可以在将其移动到 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

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

关于r - dBWriteTable 无法将 NULL 写入 SQL Server 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51598952/

相关文章:

r - 在 r ggplot 中使用 scale_color_binned 时限制和中断值的自定义标签

SQL Server日期列格式

sql-server - 如何将架构从 SQL Server 2008 迁移到 SQL Server CE 4?

r - 使用 RJDBC/RHive 从 R 连接到远程 Hive 服务器

R RJDBC java.lang.OutOfMemoryError

r - 在R中的排序向量中查找值索引

r - 对 R 中的矩阵列表求和

r - 在 Mac/Linux 上从 R 连接到 MS SQL Server

r - 如何在R中创建连接两点的线

sql - 从单个表中两次选择同一列但条件不同