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

BCP detects CRLF as data and not as Row ending

我正在使用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 被检测为两个字节的数据,它不符合 table 格式。当我使用上面的语句时,它完美地工作。

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

根据 MS 的说法,这是预期的行为:

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

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

-c

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

-r

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

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