仅在与当前值不同时更新/插入行

时间:2019-08-19 11:41:54

标签: sql-server tsql sql-server-2012

我有一个桌面应用程序,该应用程序将包含有关产品信息的数据表发送到SQL Server数据库。我只想为与收到的行不同的列更新表。我想知道什么是正确的方法:

  • 检查接收到的数据表中的值是否与实际数据库表中的值不同,然后更新该表
  • 如果修改了该值,则在包含日志的表中插入新行

我目前正在做什么:

我从新变量(@OldValue)中的数据中选择当前值,然后将其与接收到的值(@NewValue)进行比较。如果值不同,我只需更新该列,然后在日志表中插入一条新记录。

DECLARE @ProductId = 333
IF @OldValue <> @NewValue
BEGIN
    UPDATE dbo.ProductTable
       SET Column1 = @NewValue
    WHERE
       ProductId = @ProductId




 INSERT INTO 
     dbo.Logs
 VALUES
     (@ProductId, @ModifiedColumn, @OldValue, @NewValue, GETDATE())

END

我对需要更新的每一列进行检查(如果数据已更改),但是收到的数据表包含大约15列,我认为必须有一个更优雅的解决方案。

任何有用的提示将不胜感激。

2 个答案:

答案 0 :(得分:1)

我看到这种有问题的规律性。在大多数情况下,我们将所有列连接起来,并用诸如<app-primary-button [disabled]="true"></app-primary-button>之类的固定字符串分隔,然后将'||'函数应用于两个表。如果哈希值相同,则不更新该行。如果不同,我们将对其进行更新...

如果我重用您的代码,它可能是这样的:

HASHBYTES('MD5',MyConcatenatedValue)

但是,由于对所有列都进行了一次检查,因此您无法轻易地将已替换的列记录下来。也许您应该考虑实现临时表。这是有关它的文章:

https://docs.microsoft.com/fr-fr/sql/relational-databases/tables/temporal-tables?view=sql-server-2017

希望对您有帮助,告诉我是否需要更多详细信息。

答案 1 :(得分:1)

我可能会做类似下面的事情。目前仅能容纳两列,但是应该清楚如何在其中添加其他列。

<!-- 
  Bootstrap docs: https://getbootstrap.com/docs
-->

<div class="row container">
  <section>
    <a href="https://www.google.com/">
      <img src="https://helpx.adobe.com/content/dam/help/en/stock/how-to/visual-reverse-image-search/jcr_content/main-pars/image/visual-reverse-image-search-v2_intro.jpg" style="width: 150px;">
    </a>
    <h6>
      Field 1
    </h6>
  </section>
  <section>

    <a href="https://www.google.com/">
      <img src="https://helpx.adobe.com/content/dam/help/en/stock/how-to/visual-reverse-image-search/jcr_content/main-pars/image/visual-reverse-image-search-v2_intro.jpg" style="width: 150px;">
    </a>
    <h6>
      Field 2
    </h6>
  </section>
</div>