Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS;即使在插入数据库后,行也重定向到错误_Ssis_Ssis 2012 - Fatal编程技术网

SSIS;即使在插入数据库后,行也重定向到错误

SSIS;即使在插入数据库后,行也重定向到错误,ssis,ssis-2012,Ssis,Ssis 2012,我有一个SSIS包来向数据库插入/更新行。首先,我使用查找来检查行是否已经插入到数据库中;如果是,则更新该行,否则作为新行插入 我的问题是插入时,一行插入成功,但也重定向到错误。这两者如何能同时发生?这种情况有时也会发生,但并不总是如此——非常不一致。如何跟踪导致错误的原因?我在这里使用重定向行来获取失败的行 只有在服务器上部署时才会发生这种情况。使用BIDS运行我的本地计算机时效果良好。您的OLE DB目标可能设置为默认值 快速回顾所有这些值的含义 数据访问模式:通常需要表或视图-快速加载或表

我有一个SSIS包来向数据库插入/更新行。首先,我使用查找来检查行是否已经插入到数据库中;如果是,则更新该行,否则作为新行插入

我的问题是插入时,一行插入成功,但也重定向到错误。这两者如何能同时发生?这种情况有时也会发生,但并不总是如此——非常不一致。如何跟踪导致错误的原因?我在这里使用重定向行来获取失败的行


只有在服务器上部署时才会发生这种情况。使用BIDS运行我的本地计算机时效果良好。

您的OLE DB目标可能设置为默认值

快速回顾所有这些值的含义

数据访问模式:通常需要表或视图-快速加载或表或视图名称变量-快速加载,因为这将执行批量插入。非快速加载选择会导致单例插入,对于任何数据量,都会让您质疑那些告诉您SSI可以快速加载数据的人的理智。 保留标识:仅当您希望显式提供标识种子时才需要此项 Keep nulls:指定是否应允许触发默认值 表锁定:抢先锁定表。除非您处理的是Hekaton表新SQL Server 2014 candy,否则触摸表将涉及锁。是的,即使您使用NOLOCK提示。插入数据显然会导致锁定,因此我们可以确保符合ACID。SQL Server将从一个小锁开始,无论是行级还是页级。如果超过修改数据的阈值,SQL Server将升级该锁以封装整个表。这是一个性能优化,因为如果没有其他人在数据中有他们肮脏的小爪子,那么它更容易工作。惩罚是,在这个升级过程中,我们现在可能不得不等待另一个进程完成,以便获得表的独占性。如果我们一开始就做大了,我们可能在另一个过程开始之前就锁定了桌子检查约束:我们应该禁用约束值的检查吗。除非有导入后步骤来确保约束有效,否则不要取消选中此项。快速加载对域无效的数据是不好的。 每批行数:这是作为每批行数值传递给INSERT BULK语句的值。 最大插入提交大小:FastLoadMaxInsertCommitSize属性指定提交前事务中应保留多少行。2005年的默认值为0,这意味着所有内容都会提交,或者没有提交。根据您的数据量,2008+默认值20亿实际上可能是相同的。 那又怎么样 插入的某个位置有错误数据。某个原因导致插入失败。它可能是第一行,最后一行,两者都有,或者介于两者之间。最终的效果是插入本身被回滚。您将包设计为允许将坏数据路由到平面文件,以便数据管理员可以检查、清理并将其重新插入管道

然后,关键是您需要找到一些值来提供插入性能大小的最佳平衡,相对于不良大小,越多越好。为了便于讨论,让我们使用提交大小5003,因为每个人都喜欢素数,并且假设我们的数据源提供10009行数据。其中的三行将破坏目标表的完整性,需要数据管理员进行检查

这将导致总共3个批次被发送到目标。结果是出现以下情况之一

坏行是最后3行,结果只有这3行被发送到文本文件,10006行分两批提交到表中。 错误行仅存在于完整集合中的一个集合中。这将导致5006行写入表,5003行发送到我们的文件 在每个提交集之间分割坏行。这将导致0行写入表和文件中的所有数据。 我一直觉得墨菲是个乐观主义者,保存错误文件的磁盘会损坏,但我离题了

理想的做法是减少不良数据可能存在的空间,同时最大限度地增加在快照中插入的良好数据量。事实上,有很多人都写过这方面的文章,但我倾向于OLEDB目的地错误重定向中概述的方法

我们将在初始提交大小为5003的情况下执行插入,成功的行将按原样进行。坏行将转到第二个OLEDB目标,这次的提交大小较小。您是应该立即转到这里的单例插入,还是在主提交大小为一半的情况下添加中间批量插入尝试,存在不同的意见。这是您可以评估流程并为数据找到最佳解决方案的地方

如果数据仍然无法在单行级别插入,则将其写入错误文件/日志。这种方法允许您放置尽可能多的好数据 当您知道将有坏数据时,尽可能使用最有效的机制将数据输入到目标表中

错误数据补遗 然而,插入坏数据的最后一种方法是甚至不尝试插入它。如果您知道必须满足外键,请将查找组件添加到数据流中,以确保只有良好的值显示在插入中。空值也一样。您已经在检查您的业务密钥,因此副本不应成为问题。如果一个列有一个Foo必须以thite开头的约束,那么在数据流中检查它。所有坏行都被分流到一个派生列任务中,该任务添加业务友好的错误消息,然后它们到达一个Union all,然后所有的错误都进入错误文件

我还编写了这个逻辑,其中每个检查都有自己的错误列,我只在插入之前分割坏数据。这可以防止业务用户修复源数据中的一个错误,而只是为了知道还有另一个错误。哦,还有一个,再试一次。是否需要这一级别的数据清理是与您的数据供应商、数据清理者以及您的上司的对话,因为他们可能想知道您需要花费多少时间来为他们不断向您扔来的可怕数据制作此解决方案

工具书类
我的发现可能会对来这里的人有所帮助

@比林克发表了广泛的评论;我已经经历了这一切。好吧,在深入挖掘系统之后,问题有所不同

我的SSIS包中有脚本任务,用于执行某些操作。该任务使用磁盘中名为TEMP的文件夹。触发此SSIS的程序也同时使用同一TEMP文件夹。现在没有处理文件读/写异常。 这导致脚本任务失败,导致包失败错误。由于在脚本任务之前执行了插入功能,因此插入成功。稍后,当脚本失败时,它也将行移到错误位置


我尝试捕获这些文件错误/异常,结果成功了

我注意到,如果您检查锁表,并进行更新,您的数据流中的两个流之间会出现死锁。所以我们不检查表锁。性能似乎相同。

是否在错误输出中包含错误描述?源中是否有两条记录导致查找路径将第二条记录视为新记录,但由于PK/FK约束,插入失败?很高兴您解决了这一问题。将来,如果你已经尝试了所有这些方法,那么在你的问题中说明这一点,这样我们就可以为你遇到的行为寻找其他解释