我正在尝试使用 bcp 将数据从一个表复制到另一个数据库中的另一个表。
首先,使用
!! bcp dbName1.dbo.tableName1 format nul -S serverName1 -T -f D:tableName1_fmt.txt -n
然后
使用!! bcp dbName1.dbo.tableName1 out D:tableName1.txt -S serverName1 -T -c
现在我尝试使用格式化文件将数据文件导入到另一个服务器中另一个数据库中的另一个表中
!! bcp dbName2.dbo.tableName2 in D:tableName1.txt -f D:tableName1_fmt.txt -S ServerName2 -T -E
然后生成以下错误
Starting copy...
SQLState = S1000, NativeError = 0
Error = [Microsoft][ODBC Driver 13 for SQL Server]Unexpected EOF encountered in BCP data-file
0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1
我想通了问题所在。但这与Stackoverflow中的现有案例不同。
所以我正在编写我的解决方案,以防有人遇到同样的事情可能会受益。
这个谜题的答案是阴险的。 我度过了我再也回不来的时间...
如果您在Windows中,请使用NotePad++,然后在菜单上的"编码"下,将其更改为[UCS-2 LE BOM]并尝试一下。LE = 小端...
真是个可恨的错误!我刚刚安装了SQL Server 2019和最新的SQLCMD/BCP工具。似乎这个错误已经存在了一段时间。
这家伙救了我的命:https://shades-of-orange.com/post/Unexpected-EOF-encountered-in-BCP-data-file
这是我最后用的台词
bcp my_schema.my_table IN /home/user/data/data.csv -S "127.0.0.1" -d "my-database" -U "sa" -P "myPassWord" -t "," -r "n" -c -F 2
问题出在创建格式化文件和数据文件时的格式说明符(-c
、-n
(。
格式化文件 (-n
( 和数据文件 (-c
( 的格式说明符不同。
当我将两者的格式说明符更改为-c
或-n
时,导入语句起作用了。
由于保留列的数据类型对我的目的很重要,因此-n
用于格式化文件和数据文件
根据我的经验,此问题是由文件末尾的空行引起的。 建议使用
tail your_file | od -c
这样,您将看到最后一行和行终止的格式,有时需要dos2unix
dos2unix your_file
干杯!