bcp导入CSV报字符串右截断错误仅加-c参数可运行问题求助
问题原因
- 生成fmt格式文件时错误使用了
-n参数:该参数为SQL Server原生数据类型模式,专为SQL Server之间的二进制导入导出设计,不适用CSV这类纯字符分隔文件。生成的fmt文件中所有字段的分隔符配置为""(空值),导致bcp读取CSV时不会按逗号切分字段,会连续读取字符直到凑满每个字段定义的50字符长度,自然就会出现字段内容超过长度的右截断报错。 - 命令行传入的
-t ","参数优先级低于fmt文件配置,无法覆盖fmt内的空分隔符设置,因此加了也不生效。 - 额外添加
-c参数正常运行的原因是:-c为纯字符模式,会强制bcp使用逗号作为字段分隔符、换行符作为行分隔符读取CSV,同时会直接忽略fmt文件的所有配置,所以能导入成功。
小提示:你原导入命令中
-S server-T存在语法错误,缺少空格,需修正为-S server -T后再运行。
解决方案
方案1:重新生成适配CSV的fmt文件(推荐)
生成fmt时将-n替换为-c并提前指定分隔符,命令如下:
bcp [mydb].abp.blpu format nul -T -c -t "," -S server -f blpu.fmt
新生成的fmt文件会自动将前21个字段的分隔符设为,,最后一个字段的分隔符设为换行符,直接用修正后的导入命令即可正常运行,无需加-c参数。
方案2:手动修改现有fmt文件
如果不想重新生成,可以手动调整fmt里的分隔符配置:
- 前21个字段的第5列(分隔符列)从
""改为",\""(如果CSV字段带双引号包裹)或","(无引号包裹) - 第22个字段的第5列从
""改为"\r\n"(Windows系统生成的CSV)或"\n"(Linux/Mac生成的CSV)
修改后重新执行导入命令即可。
方案3:直接使用-c参数省略fmt文件
如果不需要做特殊的字段映射、格式调整,可以直接去掉-f参数,用纯字符模式导入:
bcp [mydb].abp.blpu in "records.csv" -S server -T -F 2 -c -t ","
内容的提问来源于stack exchange,提问作者Neil
相关产品推荐
相关产品推荐

