【问题标题】:BCP not copying all rowsBCP 不复制所有行
【发布时间】:2014-01-08 02:31:39
【问题描述】:

我正在使用 BCP 将行导入 SQL 服务器。当我意识到 BCP 不是随机导入所有行时,一切似乎都运行良好。一些数据被跳过(有时是 50%)。 BCP 过程没有返回任何错误。它说成功复制了 X 行。

BCP 命令和输出:

bcp MyTable IN MyTable_final.dat -f MyTable.Fmt -S <ServerIP> -U <User> -P <Pwd> -F2

输出:

Starting copy...
6 rows copied.
Network packet size (bytes): 4096
Clock Time (ms.) Total     : 63     Average : (95.24 rows per sec.)

表的 SQLSERVER 架构:

CREATE TABLE MyTable (
Type varchar(255) default NULL,
Date varchar(255) default NULL,
ID varchar(255) default NULL,
VID varchar(255) default NULL,
VName varchar(255) default NULL,
LDate varchar(225) default NULL,
id BIGINT IDENTITY(1,1) NOT NULL,
PRIMARY KEY (id) ,
CONSTRAINT d_v UNIQUE (VID, VName)
)  ;

正在使用的 BCP 格式文件:

11.0
7
1       SQLCHAR             0       255     "|"      1     Type              SQL_Latin1_General_CP1_CI_AS
2       SQLCHAR             0       255     "|"      2     Date              SQL_Latin1_General_CP1_CI_AS
3       SQLCHAR             0       255     "|"      3     ID                  SQL_Latin1_General_CP1_CI_AS
4       SQLCHAR             0       255     "|"      4     VID                SQL_Latin1_General_CP1_CI_AS
5       SQLCHAR             0       255     "|"      5     VName              SQL_Latin1_General_CP1_CI_AS
6       SQLCHAR             0       225     "|"      6     LDate               SQL_Latin1_General_CP1_CI_AS
7       SQLCHAR             0       21      "\r\n"   7     id                     ""

实际数据集:您可以看到文件中当前有 13 行。但是,在我的例子中,只有 6 行是随机导入的,没有任何错误的痕迹。

Data File

我无法弄清楚发生了什么。任何指针来捕获丢失的行并防止它?

【问题讨论】:

  • 用notepad++打开你的文件,检查你的行终止符设置是否正确。
  • 我一直在导入和导出 30 GB 的数据,但我从来没有遇到过问题
  • 我认为我发现标识列存在问题。我重新创建了没有主键 ID 的表,瞧,BCP 正在正确复制所有行。数据集不包含 Identity 列,但表中有它(ID BigINT,主键)。我需要对格式文件进行哪些更改才能使其正常工作?
  • @Backtrack 即使我被难住了。过去几个月我经常使用它(当然在不同的数据集上),但这从未发生过。
  • 好的,我发现了错误...创建一个没有 ID 的视图,它可以工作 \

标签: sql sql-server bcp identity-column


【解决方案1】:

当您拥有具有自动增量的 ID 时,就会发生这种情况。所以按照我的想法来吧

  1. 创建一个没有表ID字段的视图
  2. 在视图中插入数据

例如

CREATE TABLE DIM_Vitals (
QueryType varchar(255) default NULL,
QueryDate varchar(255) default NULL,
APUID varchar(255) default NULL,
VitalID varchar(255) default NULL,
VitalName varchar(255) default NULL,
LoadDate varchar(225) default NULL,
id BIGINT IDENTITY(1,1) NOT NULL,
PRIMARY KEY (id) ,
CONSTRAINT dim_v UNIQUE (VitalID, VitalName)
)  ;

为上表创建一个视图

   create view DIM_Vitals_view 
as 
select 
QueryType,
QueryDate,
APUID,
VitalID,
VitalName,
LoadDate
from DIM_Vitals

现在将数据插入视图 [DIM_Vitals_view - 视图名称]

bcp DIM_Vitals_view  IN DIM_Vitals_final.dat -f DIM_Vitals.Fmt -S <ServerIP> -U <User> -P <Pwd> -F2

肯定能解决问题

确保您的视图没有 id 字段

【讨论】:

  • 这是有道理的。会试一试。有什么方法可以简单地操纵格式文件以忽略身份列或其他东西?只是检查...
  • 我尝试了您的解决方案。但是,我看到以下错误...SQLState = S1002, NativeError = 0 Error = [Microsoft][SQL Server Native Client 11.0]Invalid Descriptor Index
  • 我最终创建了一个没有身份列的格式文件,并且一切正常。无需创建视图或任何东西。
【解决方案2】:

尝试将 max_errors 设置为 0

-m max_errors

指定语法错误和编译错误的最大数量 这可能在取消大容量复制操作之前发生。每一行 bcp 无法复制的内容将被忽略并计为一个错误。如果 不包含此选项,默认为 10。

【讨论】:

  • 对于那些导入大文件的人,您希望始终检查可能的错误。一旦出现 10 个警告,导入过程就会停止。设置 -m 0 会忽略该限制。
猜你喜欢
  • 2013-04-24
  • 2019-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多