如何使用大量数据执行令人讨厌的插入/更新,可能的密钥违规和错误列表返回

时间:2015-07-08 13:46:34

标签: sql sql-server

我正在寻找执行此复杂操作的策略。
我们以前有一个使用NHibernate的解决方案,它可以用于少量数据,但现在它的速度太慢了。

客户端将带有卡ID的文件上传到系统中,文件最多可包含~150 + k卡ID,这些ID分配给客户组。

要么插入单个记录,要么他的状态发生变化 表例如

+++++++++++++++++++++++++++++++++++  
|card_id* | card_group_id* |state |   
|  11112  |       meow     |  0   |
|  11131  |       meow     |  1   |
+++++++++++++++++++++++++++++++++++ 

某些ID可能违反PK /三个FK中的一个,并且这些ID应该返回给客户。

所以我基本上需要执行一次一次一次插入,“是否有效?好的。如果没有,请添加到失败的ID列表。

您能否建议我实现这一目标的策略?

不能容忍数据丢失就像1个错误的ID在同一个语句中失败了另一个1000的操作,它需要有点快所以客户端没有'挨饿等待结果通知。

后端是基于ASP.NET的,在SQL Server 2012中有数据库。

2 个答案:

答案 0 :(得分:1)

使用正确的工具完成工作。在这种情况下是SSIS,可能是Merge Transformation。从两个源(一个表,另一个文件)创建合并,然后取两个输出,插入不匹配并插入匹配的错误。 SSIS将为您提供批处理,批量插入,输入文件解析等等。

不要尝试在直接SQL中执行此操作,处理150k输入记录远非微不足道,您最终将编写一次性应用程序,而不是使用现成的组件。

答案 1 :(得分:1)

BULKINSERT将您的数据发送到@TEMPTABLE,然后使用CURSOR进行迭代。

问题:

  • 快速&脏

  • 光标效果!!