Question

J'utilise une expression de table commune pour la pagination:

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select * from query where TableRowNum between 1 and 25 Order By TableRowNum ASC

Immédiatement après avoir effectué cette requête, je fais une requête presque identique afin de récupérer le nombre total d'éléments:

with query as (
  Select Row_Number() over (Order By OrderNum ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
Select Count(*) from query

J'ai essayé de les combiner ensemble (c'est-à-dire: définir le CTE, interroger les données, puis interroger le compte, mais je reçois alors un message d'erreur "Nom d'objet non valide 'requête'" en réponse au message deuxième requête (le compte).

Existe-t-il un moyen de combiner ces deux requêtes en une seule pour enregistrer un aller-retour vers la base de données?

Était-ce utile?

La solution

Si vous n'en avez pas besoin dans 2 requêtes différentes, vous pouvez essayer

;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
),
totalCount AS (
    SELECT COUNT(1) Total FROM query
)
Select  query.*,
        Total
from    query, totalCount 
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

Si vous avez besoin de 2 requêtes différentes, utilisez plutôt une table var

DECLARE @User TABLE(
        TableRowNum INT,
        FirstName VARCHAR(50),
        LastName VARCHAR(50)
)
;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
)
INSERT INTO @User
SELECT  TableRowNum,
        FirstName,
        LastName
FROM    query

SELECT  *
FROM    @User
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

SELECT COUNT(1) FROM @User

Autres conseils

Vous pouvez le faire comme ceci:

with query as (
   Select 
 COUNT (*) OVER (PARTITION BY 1) AS TableTotalRows,
 Row_Number() over (Order By OrderNum ASC) as TableRowNum,
     FirstName,
     LastName
  From   Users
)

Selon Microsoft, dans ce lien :

  

Un CTE peut référencer lui-même et des CTE précédemment définis dans le même   Clause WITH.

Dans ce nouveau CTE faisant référence au CTE défini précédemment, nous pouvons effectuer la requête de comptage:

;with query as (
  Select Row_Number() over (Order By UserID ASC) as TableRowNum,
         FirstName,
         LastName
  From   Users
),
totalCount AS (
    SELECT COUNT(1) Total FROM query
)
Select  query.*,
        Total
from    query, totalCount 
where   TableRowNum 
between 1 and 25 
Order By TableRowNum ASC

"query" est le CTE principal et "totalCount" l'utilise pour obtenir le nombre total de lignes

Microsoft devrait avoir un exemple pour une tâche courante comme celle-ci.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top