49 votes

Comment mettre à jour et commander en utilisant ms sql

Idéalement, je veux faire ceci:

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

En anglais: je souhaite obtenir le top 10 des messages disponibles (statut = 0) dans la base de données et les verrouiller (statut = 10). Un message avec une priorité plus élevée doit être reçu en premier.

Malheureusement, MS SQL n'autorise pas la clause order by dans la mise à jour.

Quoi qu'il en soit, comment contourner cela?

102voto

Quassnoi Points 191041
WITH    q AS
        (
        SELECT  TOP 10 *
        FROM    messages
        WHERE   status = 0
        ORDER BY
                priority DESC
        )
UPDATE  q
SET     status = 10

43voto

Eduardo Crimi Points 777

Vous pouvez faire une sous-requête où vous obtenez d’abord les ID des 10 premiers ordres par priorité et les mettre à jour une fois sur la sous-requête.

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

1voto

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

0voto

Vous pouvez également utiliser la classe SET ROWCOUNT

 SET ROWCOUNT 10

UPDATE messages
SET status = 10 
WHERE status=0 

SET ROWCOUNT 0
 

Ou avec une table de temp

 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)
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X