我尝试使用非XML bcp格式文件将数据导入Win7 64位的LocalDB。最简单的用例。
OS Name: Microsoft Windows 7 Home Premium
OS Version: 6.1.7601 Service Pack 1 Build 7601
LocalDB version: Microsoft SQL Server 2014 (12.0.2000.8)
BCP version: 12.0.2000.8
基本上是几天前从Microsoft SQL Server 2014网站下载的所有内容的最新版本。
我能够通过bcp连接到LocalDB实例来创建格式文件,但生成的格式文件在尝试使用它重新导入最简单的数据时不起作用。无论我尝试什么,bcp都会加载零行,无提示失败并且不会将错误信息输出到指定的错误文件。
/* create the table */
use try_db;
create table try(num integer);
/* create the format file based on the table. */
bcp try_db.dbo.TRY format nul -n -T -f TRY.fmt -S (localdb)\default_db
/* above command creates a file TRY.fmt with the following contents */
12.0
1
1 SQLINT 1 4 "" 1 num ""
/* then I create a file data.txt, with just the number 99 in it, followed by a Windows line terminator (\r\n) */
/* then try importing the file into the table */
bcp try_db.dbo.TRY in data.txt -f TRY.fmt -T -S (localdb)\default_db -e errors.txt
结果:
Starting copy...
0 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total : 1
没有任何内容写入errors.txt。我只是无法使用格式文件让bcp导入任何东西!
我还没有尝试过使用SQL Server本身(仅限LocalDB),但对于像这样简单的事情并不重要。
我尝试编辑TRY.fmt文件行,如下所示:
1 SQLINT 1 4 "\r\n" 1 num ""
但这也没有帮助。
我能够使用-c而不是-f:
成功导入它bcp try_db.dbo.TRY in data.txt -c -T -S (localdb)\default_db -e errors.txt
关于(a)为什么bcp不能使用格式文件导入,以及(b)为什么它不会将错误打印到指定的错误文件?必须有一些非常简单的东西我在这里出错了。
请不要建议使用BULK INSERT或SSIS(等)。 bcp应该按照记录的方式工作!
答案 0 :(得分:1)
格式文件描述的是源数据而非目标。使用-c
或datafiletype='char'
时,输入数据类型必须为SQLCHAR。本机数据类型仅在使用-n
或datafiletype='native'
时有效。原生格式的源文件始终是二进制文件,因此bcp需要知道每个字段的数据类型,以便读取正确的字节数并正确解释它们。
答案 1 :(得分:-1)
我想我找到了答案。 bcp格式规范无法正常工作!似乎即使对于numeric或datetime导入字段,也必须在.fmt文件中指定“SQLCHAR”作为数据类型。任何使用“bcp格式”生成的实际.fmt文件的尝试都是没有希望的 - 如果它给你返回SQLINT或SQLDATE行,你必须用SQLCHAR替换那些用于工作的东西,即使db列实际上是数字或日期/日期时间类型。
真是个蠢货!