如何使用ms sql来更新和订购

理想情况下,我想这样做:

UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC; 

用英文:我想从数据库中获得前10个可用(状态= 0)的消息并locking它们(状态= 10)。 应该先获得优先级更高的消息。

不幸的是MS SQL不允许更新中的order by子句。

无论如何如何规避这一点?

你可以做一个子查询,你首先得到按优先级排列的前10名的ID,然后更新子查询中的那些ID:

 UPDATE messages SET status=10 WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC); 
 WITH q AS ( SELECT TOP 10 * FROM messages WHERE status = 0 ORDER BY priority DESC ) UPDATE q SET status = 10 

我必须提供这个更好的方法 – 你不总是有一个身份领域的奢侈品:

 UPDATE m SET [status]=10 FROM ( Select TOP (10) * FROM messages WHERE [status]=0 ORDER BY [priority] DESC ) m 

您也可以使子查询复杂,只要你想要 – join多个表等等…

为什么这更好? 它不依赖于messages表中的身份字段(或任何其他唯一列)的存在。 它可以用来更新任何表中的前N行,即使该表完全没有唯一键。

 UPDATE messages SET status=10 WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC); 

如下面的注释中所述,您还可以使用SET ROWCOUNT子句,但仅适用于SQL Server 2014及更早版本。

 SET ROWCOUNT 10 UPDATE messages SET status = 10 WHERE status = 0 SET ROWCOUNT 0 

更多信息: http : //msdn.microsoft.com/en-us/library/ms188774.aspx

或者与临时表

 DECLARE @t TABLE (id INT) INSERT @t (id) SELECT TOP 10 id FROM messages WHERE status = 0 ORDER BY priority DESC UPDATE messages SET status = 10 WHERE id IN (SELECT id FROM @t)