问题
无法将 NA 值从 data.frame 插入到数据库表中
步骤
从 SQL 服务器读取表到 R
data.frame
。表是十进制的,带有一些NULL
。 data.frame 是带有一些NA
的数字。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.)
我用 0 覆盖 NA,例如
dataset$column[is.na(dataset$column)] = 0
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/