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)
我正在使用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)