3个具有相同ID但使用SqlBulkCopy更改不同列的记录

bulkinsert c# primary-key sqlbulkcopy

我正在使用SqlBulkCopy进行转换。我目前有一个IList集合类,基本上我可以转换为DataTable以与SqlBulkCopy一起使用。

问题是我可以有3个具有相同ID的记录。

让我解释..这里有3条记录

ID      Name         Address
1       Scott        London
1       Mark         London
1                    Manchester

基本上我需要按顺序插入它们。因此我插入记录1如果它不存在,那么下一条记录如果它存在我需要更新记录而不是插入新的1(注意id仍然是1)所以在在第二条记录的情况下,我将ID 1上的列名称和地址替换为。

最后在第3条记录中你注意到Name不存在,但它的ID为1,并且地址为manchester,所以我需要更新记录但不更改Name但更新曼彻斯特..因此第3条记录会使id1 =

ID      Name      Address
1       Mark      Manchester

我有什么想法可以做到这一点?我很茫然。

谢谢。

编辑

好一点点更新。在使用SQLbulkCopy之前,我将管理和合并我的记录。是否有可能得到一个成功的列表和失败的列表......或者是全部或者没有的情况?我认为除了SQLbulkCopy之外没有其他替代方法可以做更新吗?

能够插入所有内容并将失败的内容插入到临时表中是理想的...因此我只需要担心纠正失败表中的那些,因为我知道的其他人都没问题

一般承认的答案

既然你需要处理的数据到DataTable (除非你正在写一个自定义IDataReader ),你应该把它们合并给予前的记录SqlBulkCopy ;例如(伪代码):

/* create empty data-table */
foreach(row in list) {
    var row = /* try to get exsiting row from data-table based on id */
    if(row == null) { row = /* create and append row to data-table */ }
    else { merge non-trivial properties into existing row */
}

一旦你有了所需的数据,然后将DataTable传递给SqlBulkCopy


重新编辑;在那种情况下,我会上传到临时表(只是一个常规表,其中包含类似上传数据的模式,但通常没有外键等),然后使用常规TSQL将数据移动到事务表中。除了完整的TSQL支持,这还可以更好地记录操作。特别是,或许可以查看INSERTOUTPUT子句,它可以帮助复杂的批量操作。


热门答案

您无法使用批量复制(批量插入)进行更新,只能插入。由此得名。

您需要在插入数据之前修复数据。如果这意味着您对预先存在的行进行了更新,则无法插入那些将导致生成密钥冲突的行。

您可以批量插入临时表,并运行相应的插入或更新语句,仅插入新行并为其余语句发出更新语句,或者在重新插入之后删除预先存在的行并修复数据。

但是没有办法说服批量复制来更新现有行。



许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因