我有一个SSIS包来插入/更新行到数据库.首先我使用查找检查行是否已经插入到DB;如果是,我更新该行,否则插入为新行.
我的问题是插入时,成功插入一行,但也重定向到错误.两者如何同时发生?这种情况有时并非总是发生 - 非常不一致.如何追踪导致错误的原因?我在这里使用"重定向行"来获取失败的行.

只有当它部署在服务器上时才会发生这种情况.使用BIDS运行我的本地机器工作正常.
您的OLE DB目标可能设置为默认值

快速回顾所有这些值的含义
Table or view - fast load或Table or view name variable - fast load因为这将执行批量插入.非快速加载选择会导致单例插入,对于任何数据量,您都会质疑那些告诉您SSIS可以非常快速地加载数据的人的理智.INSERT BULK语句的ROWS_PER_BATCH值.您的插入中的某处有错误的数据.有些东西导致插入失败.它可能是第一行,最后一行,两者之间或介于两者之间.实际效果是刀片本身回滚.您设计了包以允许将错误数据路由到平面文件,以便数据管理员可以检查它,清理它并将其重新插入管道.
关键是你需要找到一些值,提供插入性能大小的最佳平衡,相对于不良大小更好.为了论证,让我们使用提交大小5003,因为每个人都喜欢素数,并假设我们的数据源提供10009行数据.其中的三行将违反目标表的完整性,需要由数据管理员进行检查.
这将导致总共3批次发送到目的地.结果是以下方案之一
我总觉得墨菲是一个乐观主义者,持有错误文件的磁盘会腐败但我离题了.
理想的是减少可能存在的坏数据空间,同时最大化一次性插入的良好数据量.事实上,有很多人写过这篇文章,但我偏向于"使用OLE DB目标进行错误重定向"中概述的方法.
我们将以初始提交大小执行插入,5003成功的行将按原样执行.错误的行将转到第二个OLE DB目标,这次使用较小的提交大小.您是否应立即转到单例插入或在主要提交大小的一半处添加中间批量插入尝试,这是不同的意见.您可以在此处评估流程并找到最佳的数据解决方案.
如果数据仍然在单行级别插入失败,那么您将其写入错误文件/日志.这种方法允许您在知道自己将要有不良数据时,尽可能以最有效的机制将尽可能多的好数据放入目标表中.
然而,插入错误数据的最终方法是甚至不尝试插入它.如果您知道必须满足外键,请在数据流中添加一个Lookup组件,以确保只向插件提供好的值.对于NULL也是如此.您已经在检查您的业务密钥,因此重复项不应成为问题.如果列具有Foo必须以Pity开头的约束,则在数据流中检查它.错误的行全部被分流到派生列任务,它添加了业务友好的错误消息,然后它们落在Union All上,然后所有错误都会转到错误文件.
我还编写了这个逻辑,其中每个检查都有自己的错误列,我只在插入之前拆分了坏数据.这可以防止业务用户修复源数据中的一个错误,只是为了了解另一个错误.哦,还有另一个,再试一次.是否需要这种级别的数据清理是与您的数据供应商,数据清理人员以及可能与您的老板的对话(因为他们可能想知道您需要花多少时间来为这些可怕的数据制作此解决方案的子弹证明继续向你投掷)
| 归档时间: |
|
| 查看次数: |
2531 次 |
| 最近记录: |