Sql server SSIS-如果数据转换出错,我希望包失败

Sql server SSIS-如果数据转换出错,我希望包失败,sql-server,csv,ssis,data-conversion,ssis-2012,Sql Server,Csv,Ssis,Data Conversion,Ssis 2012,我正在读取CSV文件并将数据导入数据库。在我的csv文件中,有一个初始为字符串的ID字段。使用数据转换,我将ID字段的数据类型更改为Int 如果ID在至少一行中不是整数,我希望整个包失败,它不应该处理任何记录 数据转换我已经为ID字段设置了失败组件,但它仍然传递具有有效ID的其余记录 我希望整个程序包失败如果任何ID无效,我如何实现这一点 例如: 输入 由于ID的a4和a5不能通过数据转换转换为Int, 它不应处理任何记录。但是在DB表中,我得到了1,2,3。您是否考虑过将整个内容读入某种临时表

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

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

数据转换我已经为ID字段设置了失败组件,但它仍然传递具有有效ID的其余记录

我希望整个程序包失败如果任何ID无效,我如何实现这一点

例如:

输入

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

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

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

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


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

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

观察到的SSIS行为正常,请查找下面的解释。SSIS批量读取和转换数据,并将数据批量写入目标。因此,如果您的包先处理了3条记录,然后发现错误,那么包将停止,但插入的行将保留。
你能做些什么?答案是简单易用的事务!在数据流任务上设置transactionlevel=required(如果所有数据操作都在那里),或者使用MS SQL事务。一旦错误被触发,事务将被回滚,并且您将清除错误行。前一种方法在SSI和目标MS SQL服务器上都需要MSDTC,并且可能比第二种方法慢。如果需要在同一事务中包含多个任务,则需要将它们放在一个序列中,并在序列上设置TransactionLevel

使用MS SQL事务的第二种方法需要更复杂的任务流—在MS SQL目标连接管理器()上设置RetainSameConnection=true,有条件地提交或回滚事务等等。

我认为可以在SSIS包本身中执行此操作,而无需将其写入am temp表。您可以看到我的答案。如果有一条记录的ID字段无效,我不想传递任何记录。我已尝试使用问题中提到的失败组件。它传递ID为有效int的记录,ID为无效int的记录失败。但如果存在无效ID,我不想传递任何记录。Hi为延迟响应表示歉意,在我的数据流任务中,我正在对插入和更新记录使用查找转换。更新记录来自查找的匹配输出。如果我在数据流任务上设置transactionLevel=required(我已经尝试过),查找转换也会失败,这并不理想。我可以使用scripttask在ID字段中循环并仅在ID都有效的情况下发送整个数据集吗?@Rao,你可以做得更好。创建一个缓冲表,只存储有事务处理的有效记录,然后通过查找等方式从中读取。
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