Sql server 如何同时更新和添加新记录

Sql server 如何同时更新和添加新记录,sql-server,performance,tsql,insert-update,bulk,Sql Server,Performance,Tsql,Insert Update,Bulk,我有一个包含超过一百万条记录(产品)的表。 现在,我每天都需要更新现有记录和/或添加新记录 我没有一个接一个地做(需要几个小时),而是设法使用SqlBulkCopy处理一堆记录,并设法在几秒钟内完成插入,但它只能处理新的插入。所以我在考虑创建一个包含新记录和旧记录的新表;然后使用临时表(在SQL端)更新/添加到主表 有什么建议我该如何执行更新吗?我们在代码中按照您描述的方式处理这种情况;我们有一个临时表,然后运行一个更新,其中临时表中的ID与要更新的表匹配,然后运行一个插入,其中要更新的表中的I

我有一个包含超过一百万条记录(产品)的表。 现在,我每天都需要更新现有记录和/或添加新记录

我没有一个接一个地做(需要几个小时),而是设法使用
SqlBulkCopy
处理一堆记录,并设法在几秒钟内完成插入,但它只能处理新的插入。所以我在考虑创建一个包含新记录和旧记录的新表;然后使用临时表(在SQL端)更新/添加到主表


有什么建议我该如何执行更新吗?

我们在代码中按照您描述的方式处理这种情况;我们有一个临时表,然后运行一个更新,其中临时表中的ID与要更新的表匹配,然后运行一个插入,其中要更新的表中的ID为null。不过,我们通常在更新库/程序设置时这样做,因此它只在较小的表上偶尔运行。对于许多记录或日常运行,性能可能不会达到标准值。
我在这个方法中遇到的主要问题是,对于更新,我们进行了比较,以确保在实际运行更新之前至少更改了几个字段中的一个。(我们这样做的最初原因是为了避免覆盖某些默认值,这可能会影响服务器行为。如果临时表中可能包含未实际更改的记录,那么这可能是因为性能)。我们遇到了一个案例,我们确实想要更新其中一个默认值,但我们的旧脚本没有捕捉到这一点。因此,如果要进行任何比较以确定要更新哪些产品,请确保从一开始就完整,或者记录所有未比较的字段以及原因。

处理此问题的更好方法之一是使用SQL中的命令。Mssqltips有一个很好的功能,它的使用可能比其他一些命令要复杂一些


此外,由于锁定,您可能希望将其拆分为多个较小的事务,除非您知道您可以容忍在更新过程中进行阻塞。

是的,这是您应该做的。现在,在进行一项研究后,我偶然发现了SQL中的
MERGE
;你试过了吗?