理想我想这样做:

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

在英国:我想要得到的前10可用的(状态= 0)从DB消息并将其锁定(状态= 10)。具有较高优先级的消息应首先得到。

不幸的是MS SQL不因在更新子句允许的顺序。

反正如何绕过这个?

有帮助吗?

解决方案

您可以做一个子查询,你第一次得到的前10名,按优先顺序的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

您还可以使子查询中那样复杂,只要你想 - 加入多个表,等等...

这是为什么好?它不依赖于身份字段的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-我们/库/ 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)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top