2

我正在使用 SSIS 和 BIDS 处理包含大量(数百万)记录的文本文件。我决定使用批量插入任务,它工作得很好,但是目标表需要一个附加列,插入操作的默认值和批量插入任务停止工作。之后,我决定使用具有默认值的派生列和 OleDB 目标来插入批量数据。它解决了我的最后一个问题,但又产生了一个新问题:如果在 OleDB 目标中插入数据时出错,则它会执行完整回滚,并且我的表上没有添加任何行,但是当我使用批量插入任务时,那里是基于 BatchSize 配置的行。让我用一个示例来解释它:

  • 我使用一个 5000 行的文本文件。该文件在第 3000 行和第 4000 行之间包含重复的 ID(故意)。
  • 在启动 DTS 之前,目标表是完全空的。
  • 使用批量插入任务,在引发错误(并且 DTS 停止)后,目标表有 3000 行。我将BatchSize属性设置为 1000。
  • 使用 OleDB Destination,出现错误后,目标表有 0 行!我将Rows per batch属性设置为 1000,Maximum insert commit size设置为其最大值:2147483647。我尝试将最后一个更改为 0,但没有效果。

这是 OleDB Destination 的正常行为吗?有人可以为我提供有关处理这些任务的指南吗?我应该忘记使用这些任务并使用T-SQL中的批量插入吗?

作为旁注,我还尝试按照KEEPNULLS批量导入期间保留 Nulls 或 UseDefault 值(SQL Server)中的说明不使用 OleDB 目标任务,但它不起作用(可能只是我)。


编辑:有关该问题的附加信息。

表结构(示例)

药片

id int, name varchar(50), processed int default 0

CSV 文件(示例)

1, hello
2, world
4

2 回答 2

1

批量插入没有回滚,这就是它们速度快的原因。


看看使用格式文件:http: //msdn.microsoft.com/en-us/library/ms179250.aspx

于 2012-08-31T16:29:30.433 回答
0

您可以将其放置在 SSIS中的事务中(您需要运行 MSDTC ),或者您可以使用try-catch创建 T-SQL 脚本来处理批量插入的任何异常(可能只是回滚或提交)。

于 2012-08-31T17:01:39.963 回答