【发布时间】: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 代理中作为计划作业运行,因此它需要自动化,并且不会在重复时失败。跨度>
标签: sql sql-server ssis