SQL Server 2014:无法使用 bcp 和格式文件将任何数据导入 LocalDB(零行,无错误)
SQL Server 2014 : Not able to import any data into LocalDB using bcp and format file (zero rows, no errors)
我正在尝试使用非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 服务器本身(仅使用 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 应该按照记录工作!
我想我找到了答案。 bcp 格式规范无法正常工作!似乎即使对于数字或日期时间导入字段,您也必须将 "SQLCHAR" 指定为 .fmt 文件中的数据类型。任何使用 "bcp format" 生成的实际 .fmt 文件的尝试都是没有希望的——如果它给你 SQLINT 或 SQLDATE 行,你必须用 SQLCHAR 替换它们才能工作,即使 db 列在事实数字或 date/datetime 类型。
多么糟糕!
格式文件描述的是源数据而不是目标数据。当您使用 -c
或 datafiletype='char'
时,您的输入数据类型必须是 SQLCHAR。本机数据类型仅在使用 -n
或 datafiletype='native'
时有效。本机格式的源文件始终是二进制的,因此 bcp 需要知道每个字段的数据类型才能读取正确的字节数并正确解释它们。
我正在尝试使用非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 服务器本身(仅使用 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 应该按照记录工作!
我想我找到了答案。 bcp 格式规范无法正常工作!似乎即使对于数字或日期时间导入字段,您也必须将 "SQLCHAR" 指定为 .fmt 文件中的数据类型。任何使用 "bcp format" 生成的实际 .fmt 文件的尝试都是没有希望的——如果它给你 SQLINT 或 SQLDATE 行,你必须用 SQLCHAR 替换它们才能工作,即使 db 列在事实数字或 date/datetime 类型。
多么糟糕!
格式文件描述的是源数据而不是目标数据。当您使用 -c
或 datafiletype='char'
时,您的输入数据类型必须是 SQLCHAR。本机数据类型仅在使用 -n
或 datafiletype='native'
时有效。本机格式的源文件始终是二进制的,因此 bcp 需要知道每个字段的数据类型才能读取正确的字节数并正确解释它们。