sql-server - 通过 ODBC dbWriteTable 上传到 SQL Server 2012 - 错误 "String data, right truncation"列类型 chr 与 nvarchar(50)

标签 sql-server r database data.table

我尝试从 R 中插入一个 data.table 到 SQL Server 2012 数据库:

library(data.table)
library(odbc)
library(dplyr)

upload.data <- data.table(readxl::read_excel(path = uploadfile.file, sheet = 
sheet_no, skip = skip_rows), col_names = TRUE)

odbcChannel <- dbConnect(odbc::odbc(), "SQL")

dbWriteTable(odbcChannel, "Table_Name", upload.data, append = TRUE, overwrite = FALSE, row.names=FALSE, encoding = "latin1")

数据表中的列都是chr类型。 SQL Server 中目标表的列的类型为 varchar(50)

我的理解是 chr 将作为 varchar(255) 上传。因此,我会得到错误:

Error in result_insert_dataframe(rs@ptr, values) :
nanodbc/nanodbc.cpp:1587: 22001: [Microsoft][ODBC SQL Server Driver]String data, right truncation

如何更改 R 中的列以满足数据库中表的特定需求?

如果列中有不适合数据库表的内容,我希望信息被删除。

一种解决方案:将数据表上传到服务器的新表中,然后编辑类型以匹配:

dbSendStatement(odbcChannel,"ALTER  TABLE Table_Name
                             ALTER COLUMN Batch_Name Nvarchar(50)")

在此之后,我可以将数据插入到目标表中。但这看起来相当复杂,特别是如果数据库中的每一列都有不同的类型。

致以最诚挚的问候和我的谢意,

生命值

最佳答案

我找到了这个问题的解决方案。

如果我使用下面的代码,我可以定义字段类型和长度:

sql.field.types <- list(Batch_Name = "nvarchar(50)")

dbWriteTable(odbcChannel, "Table_Name", upload.data, append = TRUE, overwrite = FALSE, 
                              row.names=FALSE, encoding = "latin1", field.types = sql.field.types )

如果数据表中的某一列中的内容比数据库中定义的更长,这仍然会给我错误消息。

但是最好用R调整数据表中的数据,使其符合数据库的要求。因此,您始终拥有一个明确且可重复的流程。

最好的问候,

生命值

关于sql-server - 通过 ODBC dbWriteTable 上传到 SQL Server 2012 - 错误 "String data, right truncation"列类型 chr 与 nvarchar(50),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47830298/

相关文章:

sql - 将两个连续的行合并为一列

sql - 在 SQL Server 中向上舍入到最接近的 500 或 1000

由于长 blob 列,MySQL 在表中读/写速度非常慢

SQL - 在表中搜索重复值的所有实例

c# - Dapper 将特定列的子集直接返回到 DTO

SQL - 获得最大结果

如果组中的其他行等于 1,则替换 df 中的行 [R]

r - 使用 dplyr 计算第 n 行的自定义函数

r - 增加线图中线的最大宽度

java - 数据库连接代码运行在 Linux 而不是 Windows