通过唯一列覆盖数据库中的值

时间:2010-01-04 07:54:48

标签: sql-server-2005

我有一个包含一组列的代码的数据表comimg(ID-主键和名称varchar)。我的sql表也包含相同的(ID-主键和名称varchar)数据类型。表有200000多行。我想比较一下,如果sqltable id列在datatable中包含相同的id(datatable id列值与sqltable id字段匹配)。如果两个id相同,它将覆盖sqltable中的重新编号。

Vivek Jagga 昌迪加尔

1 个答案:

答案 0 :(得分:1)

我的假设是数据表行都具有“已添加”状态,因此将导致执行InsertCommand。

选项1 - 创建一个存储过程,检查具有该ID的记录是否已经存在。如果存在,请执行UPDATE,否则执行INSERT。将此sproc指定为InsertCommand

选项2(假设SQL 2005 +) - 创建一个在TRY块内尝试INSERT的存储过程。在CATCH块中,如果错误是PK约束错误(ERROR_NUMBER() = 2627,那么这意味着具有该ID的记录已经存在,因此对其执行UPDATE。将此sproc分配为InsertCommand

选项3 - 将数据表中的所有数据加载到新表中(为此使用SqlBulkCopy类)。然后UPDATE从该表中已存在ID的实际表中记录。然后将记录INSERT到真实表中,它们尚不存在。

选项1的开销是每次在执行任何操作之前检查记录是否存在,这对整个活动来说可能相对昂贵。

如果大多数时候选项2更优化,你知道大多数记录都是新的(即如果有很多更新,那么你就会遇到PK错误)。

选项3可以正常运行。 SqlBulkCopy类是将数据批量加载到数据库中的快速方法。