SSIS - 如果数据转换转换中出现错误,我希望包失败

时间:2016-07-27 11:37:47

标签: sql-server csv ssis data-conversion ssis-2012

我正在读取CSV文件并将数据导入数据库。在我的csv文件中有一个ID字段,最初是字符串。使用数据转换转换我将ID字段的数据类型更改为Int。

如果ID不是至少一行中的整数,我希望整个包失败,它不应该处理任何记录。

数据转换我为ID字段设置了Fail组件,但它仍然传递了其他具有有效ID的记录。

如果任何身份证无效,我希望整个套餐失败,我该怎么办?

示例:

输入

ID | value
1  | apple
2  | Orange
3  | Kiwi
a4 | Black
a5 | Blue

由于ID的a4和a5无法通过数据转换转换转换为Int, 它不应该处理任何记录。但是在DB表中我得到1,2,3。

4 个答案:

答案 0 :(得分:1)

观察到的SSIS行为是正常的,请在下面找到解释。 SSIS批量读取和转换数据,并将数据批量写入目标。因此,如果您的包处理了3个第一个记录,然后发现错误,则包将停止,但插入的行将保留 你能做些什么呢?答案很简单 - 使用交易!在数据流任务上设置 transactionlevel = required (如果存在所有数据操作),或使用MS SQL事务。一旦错误被触发 - 事务将被回滚,你将摆脱错误的行。前一种方法在SSIS和目标MS SQL服务器上都需要MSDTC,并且与第二种方法相比可能更慢。如果您需要在同一事务中包含多个任务 - 您需要将它们放在一个序列中,并在序列上设置 TransactionLevel 。 /> MS SQL事务的第二种方法需要更复杂的任务流 - 有条件地提交或回滚事务,在MS SQL目标连接管理器(see example with screenshots)上设置 RetainSameConnection = true 等。< / p>

答案 1 :(得分:0)

您是否考虑将整个内容读入某些临时表并检查内容?

create table test
(
    id varchar(5),
    c1 varchar(500)
)

insert into test values (1, 'apple')
insert into test values (2, 'orange') 
insert into test values (3, 'kiwi')
insert into test values ('a4', 'black')
insert into test values ('a5', 'blue')

if (select COUNT(*) from test where ISNUMERIC(id) = 0) > 0
begin
    select 'bad values and let ssis package know'
end

答案 2 :(得分:0)

您希望将错误记录定向到另一个路径。然后,您可以(尽可能多的开发人员)保存错误记录并在以后解决它们并继续处理有效数据。

当然,您可以在转换中将错误设置为失败,而不是重定向错误行。在转换任务中,单击“配置错误输出”&#39; (在你的左下角),你可以决定是否要忽略,失败组件或重定向,以防出现错误。

答案 3 :(得分:0)

在数据流之前添加额外的数据流(temp),在temp中,将csv加载到临时表(临时表与真实表具有相同的结构),将此新数据流连接到数据流,连接条件成功,这意味着加载临时表必须成功才能继续加载实际表。

相关问题