SQL批量数据插入或更新

时间:2012-11-29 15:11:09

标签: sql-server c#-4.0

好的,就这样吧。我面临的要求是我在数据库中有一个表“MyDbTable”,其中包含大量数据。

让我们说它有三列,如:

ColA ColB ColC

1 A AB
2 b bc
3 c cd


ColA是身份

现在我调用一个Web服务,预期结果包含大约1500行。

架构与返回的结果相同:

ColA ColB ColC

1的xy
3c中YZ
图4c YZ

现在我真正想做的是检查我在服务结果中的现有记录并在MyDbTable中更新它们,在这种情况下,它将是ColA中1和3的记录。我将不得不更新它们。对于具有ColA值4的记录,webservice结果是新的,所以我必须插入它。

现在的问题是MyDbTable有数千行,服务也会返回多行。

我知道最简单的方法是使用我们遍历每条记录,检查它然后通过应用程序或存储过程来处理它的蛮力。

我真正想知道的是如何以最优化的方式做到这一点。

2 个答案:

答案 0 :(得分:1)

这就是我认为是最有效的方法(尽管没有测量它):

  1. 使用SqlBulkCopy Class提供的批量复制操作,将从Web服务返回的整个表复制到数据库的临时表中。

  2. 使用单个SQL Server MERGE statement进行"更新或插入"从临时表到真实表的操作。

  3. 如果您使用的是早于2008的SQL Server版本,则可以使用an UPDATE statement with an OUTPUT clause代替MERGE

答案 1 :(得分:0)

嗯,你可以做一件事......

从Web服务获取第一行并获取它的ID说“1”并将其传递给GetRecordFromDB方法...

现在,如果该方法返回某个对象,则将其值设置为您从Webservice中找到的值,然后调用方法更新数据库中的记录。

所以代码逻辑将是

object updateorinsert = library.getobjectbyid(IDFROMFirstRecordOfWebservice)
if (updateorinsert  != null)
   {
           updateorinsert.ColAValue = WebserviceData.ColAValue
   }

  updateorinsert.ColBValue = WebserviceData.ColBValue
  updateorinsert.ColCValue = WebserviceData.ColCValue

library.UpdateRecordOrInsertInDB(updateorinsert);

您也可以使用SqlBulkCopy,并使用登台表,您可以执行适合您所有需要的Inser / Update。

您可以执行以下操作:在临时表和实际表中的所有ID都应在BulkInsert之后删除,然后将所有记录从分段复制到实际。

Using SQLBulkCopy to Insert/Update database

我希望以上链接有所帮助。