在 SSIS 执行 SQL 任务中捕获错误行

Posted

技术标签:

【中文标题】在 SSIS 执行 SQL 任务中捕获错误行【英文标题】:Trap Error rows in SSIS Execute SQL Task 【发布时间】:2012-07-15 22:44:43 【问题描述】:

我有一个 SSIS 包,可以将一堆 XML 文件导入 SQL 表。 XML 导入完成后,我运行一个执行 SQL 任务来更新一些记录,并导入其他不存在的记录。其中一项任务根据他们的电话号码创建用户登录。有时源数据有错误,没有输入数字,或者输入了重复的数字。我无法控制数据输入,但 userlogon 表当然需要唯一值。

如何配置 Exec SQL 任务以简单地忽略 PK Violation 错误并继续下一条记录?

这是 SQL 代码:

insert into Logins
select REPLACE(LTRIM(REPLACE(Customer_Number, '0', ' ')), ' ', '0'), RIGHT(customer_number,4) + EFFDAT, Company_Name, Customer_Number, Email_Address, 0, CU_Allow_Web_Ordering, 0, 0, 1 from CUSTOMER_MASTER_FILE where CUSTOMER_NUMBER not in
(select CustomerNumber from Logins)

【问题讨论】:

您的设置方式我不确定是否可以使用 SSIS 捕获错误(但我很想知道这是否不正确)。推测插入失败是因为转换后的Customer_Number 违反了Logins 中的PK,但请注意,您只是检查CUSTOMER_NUMBER未转换 版本是否存在-根本不检查空值,正如您的问题所建议的那样。此外,最好将该检查从WHERE 子句中移到LEFT JOIN 中。有意义吗? 我明白你在说什么。我实际上发布了错误的代码,但我想做的是类似的,只是从不同的来源插入登录表。我改为左连接,但当然我仍然受到 PK 违规的打击。我想知道在 SSIS 中是否有一种方法可以完成我想要做的事情,只需跳过具有重复 PK 值的记录。 更新代码:INSERT INTO LOGINS SELECT DISTINCT REPLACE(CDA_PHONE, '-', ''), LEFT(CDA_NAME, 4) + RIGHT(CDA_PHONE, 4), CDA_NAME, CDA_CUSTOMER_NUMBER, CDA_EMAIL, 1, CDA_ALLOW_WEB_ORDERING, 0, 0, 5, CDA_LOCATION_CODE FROM CUSTOMER_DELIVERY_ADDRESS LEFT JOIN LOGINS ON REPLACE(CDA_PHONE, '-', '') = USERID WHERE CDA_PHONE '000-000-0000' select 中的前两列是用户名(去掉 - 的电话号码,和密码(根据姓名和电话号码创建) where 子句删除没有电话号码的记录(在 XML 源数据中默认为 000-000-0000)所以我只需要在创建登录 ID 时处理重复的电话号码。 我应该补充一点,这个执行 SQL 任务是一个组件,它是一个更大的 SSIS 包,在 SQL 代理中作为计划作业运行,因此它需要自动化,并且不会在重复时失败。跨度> 【参考方案1】:

如果您想提交与您类似的查询,则不能。 例如,您不能提交一批 10 行并提交 8 并失败 2。

我不认为这个解决方案很好,我认为你应该在尝试插入数据之前以某种方式测试登录是否存在,但是如果你愿意,你可以将组件的 maxNumberOfErrors 配置为一个非常大的数字并尝试插入在循环组件上一一登录。组件失败不会导致包失败,直到失败次数达到maxNUMerOfErrors。

【讨论】:

以上是关于在 SSIS 执行 SQL 任务中捕获错误行的主要内容,如果未能解决你的问题,请参考以下文章

如果存储过程失败,则在执行 SQL 任务中将输出变量值获取到 ssis 变量中

SSIS 执行 SQL 查询任务找不到存储过程

使用 ssis 包在 SQL Server 代理作业中找不到存储过程错误

SSIS OlEDB 连接管理器错误

在自定义 SSIS 任务中执行 SQL 的首选方式是啥?

SSIS onerror 事件。执行 SQL 任务就坐在那里