使用R从SQL Server导入数据时前导零被截断问题咨询
解决方案
核心问题是RODBC查询时默认将格式符合数值规则的字段自动识别为数值类型,前导零在数据导入阶段就被截断,后续写入文件时自然无法保留。你可以通过以下两种方式解决:
方案1:SQL查询层面强制字段转为字符串(最稳妥)
在查询时将需要保留前导零的字段显式转换为字符串类型,从数据源端避免RODBC误判类型,示例修改如下:
library(RODBC) library(lubridate) library(data.table) cn_1 <- odbcConnect('channel_name') # 替换为实际需要保留前导零的字段名,不要用select * 拉取全表 qry <- " select CAST(需要保留前导零的字段名 AS VARCHAR(20)) AS 需要保留前导零的字段名, 其他字段1, 其他字段2 from table_name " x_1 <- sqlQuery(channel=cn_1, query=qry, stringsAsFactors=FALSE) rm(qry) setDT(x_1) fwrite(x=x_1, file=paste0(export_location, "file_name", date_today, ".txt"), sep="|", quote=TRUE, row.names=FALSE, na="")
注:VARCHAR的长度请根据字段实际存储的最大长度设置。
方案2:RODBC导入时强制不自动转换类型
给sqlQuery添加as.is = TRUE参数,强制所有字段以字符串类型导入,无需修改SQL语句:
library(RODBC) library(lubridate) library(data.table) cn_1 <- odbcConnect('channel_name') qry <- " select * from table_name " # 添加as.is=TRUE参数,若仅需特定字段保留原格式,可传入字段名向量,如as.is = c("字段1","字段2") x_1 <- sqlQuery(channel=cn_1, query=qry, stringsAsFactors=FALSE, as.is = TRUE) rm(qry) setDT(x_1) fwrite(x=x_1, file=paste0(export_location, "file_name", date_today, ".txt"), sep="|", quote=TRUE, row.names=FALSE, na="")
验证方式
导入数据后执行str(x_1)查看对应字段的类型,若显示为chr(字符型)则说明设置生效,输出文件时会自动保留前导零。
内容的提问来源于stack exchange,提问作者Champ
相关产品推荐
相关产品推荐

