在 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 变量中