BCP将CRLF检测为数据而不是行结束

时间:2018-03-21 10:37:27

标签: sql sql-server-2008 sql-server-2008-r2 bcp

我使用bcp导出和导入数据,例如:

bcp "exec db.dbo.procedure" queryout "C:\Users\I\Desktop\ps.dat" -c -r "*" -t; -S -U -P

bcp db.dbo.table in C:\Users\I\Desktop\ps.dat -e "C:\Users\I\Desktop\ps_error.dat" -c -r "*" -t; -m1000000 -S -U -P

如果我在没有-r的情况下执行这些语句,bcp会使用默认的CRLF作为行尾。之后,导入失败,并且数据截断正确。

经过这么多尝试后,我发现CRLF被检测为两个字节的数据,并且它不适合表格格式。当我使用上述陈述时,它完美无缺。

为什么会这样?这是一个bcp错误,还是预期的行为?

1 个答案:

答案 0 :(得分:1)

据MS称,这是预期的行为:

https://docs.microsoft.com/en-us/sql/tools/bcp-utility

本文解释了所有参数,对于这种情况,这些是我们感兴趣的:

-c

使用字符数据类型执行操作。此选项不会提示每个字段;它使用char作为存储类型,没有前缀,并且\ t(制表符)作为字段分隔符,\ r \ n(换行符)作为行终止符。 -c与-w。

不兼容

-r

row_term 指定行终止符。默认值为\ n(换行符)。使用此参数可覆盖默认行终止符。有关详细信息,请参阅指定字段和行终止符(SQL Server)。

所以似乎通过删除-r将行终止符设置为\ n(LF),-c接管并将行终止符设置为\ r \ n(CRLF)