检查SQL中是否已更新行的最佳方法

时间:2009-03-30 17:43:07

标签: c# sql asp.net sql-server tsql

我有一个更新表的更新语句。并且有一列记录上次修改时间。如果未更改特定行中的数据,我不想更改上次修改的日期时间。

检查更新语句是否会更改数据行的最佳方法是什么。

谢谢,

8 个答案:

答案 0 :(得分:9)

检查代码中的旧数据与新数据,而不是在查询中执行此操作。

如果数据根本没有改变,则无需不必要地打扰数据库层。

简而言之,如果数据没有改变,请不要发送UPDATE语句。

答案 1 :(得分:2)

一种方法是启动一个事务,选择该行的内容并将其与您要更新它的内容进行比较。如果它们不匹配,则执行更新并结束事务。如果匹配,则回滚事务。

答案 2 :(得分:1)

如果你想要抢先这样做,我能想到的唯一方法就是修改update语句的WHERE子句来比较现有值和新值(对于每个值)。如果 ANY 不相等,则应进行更新。

答案 3 :(得分:1)

这就是DAL很方便的时候。它会跟踪所有列,所以如果没有更改,那么我甚至不会向数据库发送UPDATE语句。

答案 4 :(得分:1)

听起来你正在浏览一个表并修改一些行,然后你想第二次在表中返回并更新刚刚更改过的行的时间戳。

不要两次通过。只需在更新要更改的其他列时同时更新日期/时间:

UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
    lastmodified = GetDate()
WHERE ...

或者您是在所有行上发布更新语句,但对于大多数行,它只是将其设置为已有的值?不要那样做。排除那些在where子句中不会被修改的行:

UPDATE myTable
SET retailprice = wholesaleprice * 1.10,
    lastmodified = GetDate()
WHERE retailprice <> wholesaleprice * 1.10

答案 5 :(得分:1)

这取决于您是否控制了数据。上面的Seb说你应该在更新前检查旧数据与新数据是正确的。但是,如果数据不在您的控制之下呢?

假设您是要求进行更新的网络服务。然后检查的唯一方法是查询现有数据并将其与新数据进行比较。

不知道任何可以检测更新是否实际更改了任何数据的SQL功能。

SQL中有一些方法可以检测update语句中包含的行数。不知道检测更新语句是否实际更改了任何数据的方法,这将是有趣的。

答案 6 :(得分:1)

如果您使用的是sql 2005/2008,那么您可以在存储过程中执行以下操作。

update  newTable 
set     readKey='1'
output  inserted.id,
        inserted.readKey as readKey,
        deleted.readKey as prevReadKey
into @tempTable
where id = '1111'

然后,您可以从@tempTable中选择以验证prevReadKey和readKey是否具有相似的值,如果两者具有相似的值,则可以重置上次修改的日期时间。

这样,在实际更改值时,您不必在表上触发多个查询。但是在值没有改变的情况下是的,这将触发两个更新语句,其中不需要。如果这些情况很少,这应该没问题。

P.S。注意: - 给出的查询可能在语法上是错误的,因为它没有经过测试。但这是你的问题可以解决的方式。我在以下方式中使用OUTPUT子句和我的一个项目中的Merge语句完成它,也可以使用update语句完成。这是reference of OUTPUT Clause

答案 7 :(得分:0)

您可以在T-SQL中编写一个INSTEAD OF UPDATE触发器,您可以在DAL层中执行上面建议的操作 - 比较现有记录中的值与update语句中的值,并应用是否更新。您可以在触发器中使用Columns_Updated()函数来查看是否有任何更新,并相应地继续。

从机器的角度来看,它并不是特别有效,但你可以写一次,无论哪个应用程序,存储过程或其他进程试图更新记录,它都会处理这种情况。