Comment sélectionner les loggings commandés par DESC?

SET @LatestRowNum = 2; WITH OrderedOrders AS ( SELECT ROW_NUMBER() OVER(order by ID desc) AS Rownum, * FROM someTable WITH(NOLOCK) ORDER BY ID DESC ) SELECT * FROM OrderedOrders WHERE Rownum = @LatestRowNum 

La requête ci-dessus me lance

Msg 1033, niveau 15, état 1, ligne 17 La clause ORDER BY n'est pas valide dans les vues, les fonctions inline, les tables dérivées, les sous-requêtes et les expressions de table communes, sauf si TOP, OFFSET ou FOR XML est également spécifié.

Comment atteindre l'objective selon lequel j'attends parfois les derniers loggings ou parfois les deuxièmes derniers loggings?

Vous n'avez pas besoin de clause interne ORDER puisque vous utilisez la clause ORDER dans ROW_NUMBER() .

Essaye ça

 SET @LatestRowNum = 2; WITH OrderedOrders AS ( SELECT ROW_NUMBER() OVER(order by ID desc) AS Rownum,* FROM someTable WITH(NOLOCK) ) SELECT * FROM OrderedOrders WHERE Rownum = @LatestRowNum 

Bien que la command ne soit pas nécessaire autre que row_number si un seul logging est renvoyé par la requête. mais vous pouvez essayer d'append un mot key TOP . Notez que TOP 100 PERCENT ne fonctionne pas. vous pouvez essayer d'append TOP 9999999 (maximum) nombre possible.
En outre, certains commentaires dans OP suggèrent qu'il n'est pas nécessaire d'append une command en raison de ORDER BY dans ROW_NUMBER mais ROW_NUMBER ne command pas toujours les lignes (reference: https://msdn.microsoft.com/en-in/library/ms186734.aspx . Remarques générales).

Il n'y a aucune garantie que les lignes renvoyées par une requête utilisant ROW_NUMBER () seront commandées exactement de la même manière à chaque exécution

Vous pouvez vous référer à quelques articles utiles:
http://blog.sqlauthority.com/2010/08/23/sql-server-order-by-does-not-work-limitation-of-the-views-part-1/

Créer une vue avec la clause ORDER BY


Modifier:
l'autre solution utilise une variable au lieu de constante dans le mot key TOP . par exemple TOP (@T) PERCENT .

 declare @t as tinyint = 100 declare @tbl as table (num1 int,num2 int) insert into @tbl values (7,1),(2,7),(4,6),(6,4), (7,1),(2,7),(4,6),(6,4) select * from(select top 100 percent * from @tbl order by num1) t select * from(select top (@t) percent * from @tbl order by num1) t 

Dans l'exemple ci-dessus, la dernière requête donne le résultat attendu. S'il y a une variable dans le mot-key TOP, le SQL suppose qu'il pourrait y avoir une valeur donc il la considérera toujours au lieu de l'ignorer.