Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SSIS执行SQL任务中的陷阱错误行_Sql_Sql Server_Ssis - Fatal编程技术网

SSIS执行SQL任务中的陷阱错误行

SSIS执行SQL任务中的陷阱错误行,sql,sql-server,ssis,Sql,Sql Server,Ssis,我有一个SSIS包,它将一组XML文件导入SQL表。XML导入完成后,我运行执行SQL任务来更新一些记录,并导入其他不存在的记录。其中一个任务根据用户的电话号码创建用户登录。有时源数据有错误,没有输入数字,或者输入了重复的数字。我无法控制数据输入,但是userlogon表当然需要唯一的值 如何配置Exec SQL任务以忽略PK冲突错误并继续执行下一条记录 以下是SQL代码: insert into Logins select REPLACE(LTRIM(REPLACE(Customer_Numb

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

如何配置Exec SQL任务以忽略PK冲突错误并继续执行下一条记录

以下是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)

如果你想提交像你这样的查询,你不能。 例如,您不能提交一批10行,提交8行,失败2行


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

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


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

按照您的设置方式,我不确定是否可以使用SSI捕获错误(但我想知道这是否不正确)。可能插入失败是因为转换后的
客户号
违反了
登录
中的PK,但请注意,您只检查
客户号
的未转换版本是否存在,而根本不检查空值,正如您的问题所表明的那样。此外,最好将该签出从
WHERE
子句移动到
左连接中。有道理吗?我明白你的意思。我实际上发布了错误的代码,但我尝试做的是类似的,只是从不同的源插入到logins表中。我改为左键连接,但当然我仍然会受到PK违规的攻击。我想知道在SSIS中是否有一种方法可以完成我想做的事情,简单地用一个重复的PK值跳过记录。更新的代码:在登录中插入选择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,其中CDA_PHONE“000-000-0000”select中的前两列是用户名(删除了带“-”的电话号码和密码(根据名称和电话号码创建))WHERE子句删除没有电话号码的记录(在XML源数据中默认为000-000-0000)因此,在创建登录ID时,我只需要处理重复的电话号码。我应该补充的是,此执行SQL任务是一个组件,是一个更大的SSIS包,在SQL Agent中作为计划作业运行,因此它需要自动化,并且不会在DUP上失败。按照您的设置方式,我不确定是否可以使用SSIS捕获错误(但我想知道这是否正确)。可能插入失败是因为转换后的
客户号
违反了
登录
中的PK,但请注意,您只检查
客户号
的未转换版本是否存在,而根本不检查空值,正如您的问题所表明的那样。此外,您最好将其移动签出一个
WHERE
子句并进入一个
LEFT JOIN
。有意义吗?我明白你的意思。我实际上发布了错误的代码,但我尝试做的是类似的,只是从不同的源插入到logins表中。我改为LEFT JOIN,但当然我仍然受到PK冲突的影响。我想知道精简SSIS有一种方法可以完成我试图做的事情,只需使用重复的PK值跳过记录。更新的代码:插入到登录中选择DISTINCT REPLACE(CDA_PHONE,“-”,”),LEFT(CDA_NAME,4)+RIGHT(CDA_PHONE,4),CDA_名称,CDA_客户_编号,CDA_电子邮件,1,CDA_允许WEB_订购,0,0,5,CDA_位置代码来自客户_配送地址左加入登录替换(CDA_电话,“-”,”)=用户ID其中CDA_电话“000-000-0000”选择中的前两列是用户名(删除了“-”的电话号码和密码(根据名称和电话号码创建)where子句删除没有电话号码的记录(在XML源数据中默认为000-000-0000)因此,在创建登录ID时,我只需要处理重复的电话号码。我应该补充的是,此执行SQL任务是一个组件,它是一个更大的SSIS包,在SQL代理中作为计划作业运行,因此它需要自动化,并且不会在DUP上失败。