2010-02-11 5 views

Répondre

34

Vous pouvez essayer quelque chose comme

DECLARE @Table TABLE(
     Val VARCHAR(50) 
) 

DECLARE @PageSize INT, 
     @Page INT 

SELECT @PageSize = 10, 
     @Page = 2 

;WITH PageNumbers AS(
     SELECT Val, 
       ROW_NUMBER() OVER(ORDER BY Val) ID 
     FROM @Table 
) 
SELECT * 
FROM PageNumbers 
WHERE ID BETWEEN ((@Page - 1) * @PageSize + 1) 
     AND (@Page * @PageSize) 
+0

Je pense que ce code dosn't travail. Avez-vous testé ce code? (Il devrait remplacer la table « numéros de page » avec le « @Table ». – RockOnGom

+0

@zeitgeist, il fait usage d'un CTE appelé les numéros de page. Avez-vous testé le code PHP? –

33

Vous pouvez utiliser ROW_NUMBER():

Renvoie le numéro séquentiel d'une rangée à l'intérieur d'une partition d'un ensemble de résultats, à partir de 1 pour la première ligne de chaque partition.

Exemple:

WITH CTEResults AS 
(
    SELECT IDColumn, SomeField, DateField, ROW_NUMBER() OVER (ORDER BY DateField) AS RowNum 
    FROM MyTable 
) 

SELECT * 
FROM CTEResults 
WHERE RowNum BETWEEN 10 AND 20; 
2

1) CREER DUMMY DATA

CREATE TABLE #employee (EMPID INT IDENTITY, NAME VARCHAR(20)) 

DECLARE @id INT = 1 

WHILE @id < 200 

BEGIN 
INSERT INTO #employee (NAME) VALUES ('employee_' + CAST(@id AS VARCHAR)) 
SET @id = @id + 1 
END 

2) maintenant appliquer la solution.

Ce cas suppose que EMPID soit une colonne unique et triée.

hors cours, vous appliquerez une autre colonne ...

DECLARE @pageSize INT = 20 

SELECT * FROM (

SELECT *, PageNumber = CEILING(CAST(EMPID AS FLOAT)/@pageSize) 
FROM #employee 
) MyQuery 

WHERE MyQuery.PageNumber = 1   
+0

Belle approch mais l'ajout d'une nouvelle colonne pourrait être une tête –

12

SQL Server 2012 fournit une fonctionnalité de pagination (voir http://www.codeproject.com/Articles/442503/New-features-for-database-developers-in-SQL-Server)

En SQL2008 vous pouvez le faire de cette façon:

declare @rowsPerPage as bigint; 
declare @pageNum as bigint; 
set @rowsPerPage=25; 
set @pageNum=10; 

With SQLPaging As ( 
    Select Top(@rowsPerPage * @pageNum) ROW_NUMBER() OVER (ORDER BY ID asc) 
    as resultNum, * 
    FROM Employee) 
select * from SQLPaging with (nolock) where resultNum > ((@pageNum - 1) * @rowsPerPage) 

Prooven! Cela fonctionne et évolue constamment.

0

Voici ma solution pour paginer le résultat de la requête dans le serveur SQL. J'ai ajouté le concept de filtrage et d'ordre par une colonne. Il est très efficace lorsque vous paginez, filtrez et commandez dans votre Gridview. Avant de tester, vous devez créer un exemple de tableau et insérer une ligne dans ce tableau: (Dans le monde réel, vous devez modifier la clause Where en tenant compte de votre table et peut-être avoir des jointures et sous-requêtes dans la partie principale de select)

Create Table VLT 
(
    ID int IDentity(1,1), 
    Name nvarchar(50), 
    Tel Varchar(20) 
) 
GO 


Insert INTO VLT 
VALUES 
    ('NAME' + Convert(varchar(10),@@identity),'FAMIL' +  Convert(varchar(10),@@identity)) 
GO 500000 

Dans SQL Server 2008, vous pouvez utiliser le concept CTE.À cause de cela, je l'ai écrit deux types de requête pour le serveur SQL 2008+

- SQL Server 2008+

DECLARE @PageNumber Int = 1200 
DECLARE @PageSize INT = 200 
DECLARE @SortByField int = 1 --The field used for sort by 
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC 
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/) 
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter 
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information. 

SELECT 
    Data.ID, 
    Data.Name, 
    Data.Tel 
FROM 
    ( 
    SELECT 
     ROW_NUMBER() 
     OVER(ORDER BY 
       CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC' 
         THEN VLT.ID END ASC, 
       CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC' 
         THEN VLT.ID END DESC, 
       CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC' 
         THEN VLT.Name END ASC, 
       CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC' 
         THEN VLT.Name END ASC, 
       CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC' 
         THEN VLT.Tel END ASC, 
       CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC' 
         THEN VLT.Tel END ASC 
     ) AS RowNum 
     ,* 
    FROM VLT 
    WHERE 
     (-- We apply the filter logic here 
     CASE 
      WHEN @FilterType = 'None' THEN 1 

      -- Name column filter 
      WHEN @FilterType = 'Contain' AND @FilterColumn = 1 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.ID LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 1 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.ID NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 1 
      AND VLT.ID = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1 
      AND VLT.ID <> @FilterValue THEN 1    

      -- Name column filter 
      WHEN @FilterType = 'Contain' AND @FilterColumn = 2 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Name LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 2 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Name NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 2 
      AND VLT.Name = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2 
      AND VLT.Name <> @FilterValue THEN 1   

     -- Tel column filter 
     WHEN @FilterType = 'Contain' AND @FilterColumn = 3 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Tel LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 3 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Tel NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 3 
      AND VLT.Tel = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3 
      AND VLT.Tel <> @FilterValue THEN 1  

     END 
    ) = 1 
) AS Data 
WHERE Data.RowNum > @PageSize * (@PageNumber - 1) 
    AND Data.RowNum <= @PageSize * @PageNumber 
ORDER BY Data.RowNum 

GO 

et seconde solution avec CTE dans le serveur SQL 2008+

DECLARE @PageNumber Int = 1200 
DECLARE @PageSize INT = 200 
DECLARE @SortByField int = 1 --The field used for sort by 
DECLARE @SortOrder nvarchar(255) = 'ASC' --ASC or DESC 
DECLARE @FilterType nvarchar(255) = 'None' --The filter type, as defined on the client side (None/Contain/NotContain/Match/NotMatch/True/False/) 
DECLARE @FilterValue nvarchar(255) = '' --The value the user gave for the filter 
DECLARE @FilterColumn int = 1 --The column to wich the filter is applied, represents the column number like when we send the information. 

;WITH 
    Data_CTE 
    AS 
    ( 
    SELECT 
     ROW_NUMBER() 
     OVER(ORDER BY 
       CASE WHEN @SortByField = 1 AND @SortOrder = 'ASC' 
         THEN VLT.ID END ASC, 
       CASE WHEN @SortByField = 1 AND @SortOrder = 'DESC' 
         THEN VLT.ID END DESC, 
       CASE WHEN @SortByField = 2 AND @SortOrder = 'ASC' 
         THEN VLT.Name END ASC, 
       CASE WHEN @SortByField = 2 AND @SortOrder = 'DESC' 
         THEN VLT.Name END ASC, 
       CASE WHEN @SortByField = 3 AND @SortOrder = 'ASC' 
         THEN VLT.Tel END ASC, 
       CASE WHEN @SortByField = 3 AND @SortOrder = 'DESC' 
         THEN VLT.Tel END ASC 
     ) AS RowNum 
     ,* 
    FROM VLT 
    WHERE 
     (-- We apply the filter logic here 
     CASE 
      WHEN @FilterType = 'None' THEN 1 

      -- Name column filter 
      WHEN @FilterType = 'Contain' AND @FilterColumn = 1 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.ID LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 1 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.ID NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 1 
      AND VLT.ID = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 1 
      AND VLT.ID <> @FilterValue THEN 1    

      -- Name column filter 
      WHEN @FilterType = 'Contain' AND @FilterColumn = 2 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Name LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 2 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Name NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 2 
      AND VLT.Name = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 2 
      AND VLT.Name <> @FilterValue THEN 1   

     -- Tel column filter 
     WHEN @FilterType = 'Contain' AND @FilterColumn = 3 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Tel LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'NotContain' AND @FilterColumn = 3 
      AND (-- In this case, when the filter value is empty, we want to show everything. 
       VLT.Tel NOT LIKE '%' + @FilterValue + '%' 
       OR 
       @FilterValue = '' 
       ) THEN 1 
      WHEN @FilterType = 'Match' AND @FilterColumn = 3 
      AND VLT.Tel = @FilterValue THEN 1 
      WHEN @FilterType = 'NotMatch' AND @FilterColumn = 3 
      AND VLT.Tel <> @FilterValue THEN 1  

     END 
    ) = 1  
) 

SELECT 
    Data.ID, 
    Data.Name, 
    Data.Tel 
FROM Data_CTE AS Data 
WHERE Data.RowNum > @PageSize * (@PageNumber - 1) 
    AND Data.RowNum <= @PageSize * @PageNumber 
ORDER BY Data.RowNum 
-2

SELECT Id DISTINCT, ParticipantId, ActivityDate, IsApproved, IsDeclined, IsDeleted, SubmissionDate, IsResubmitted,

[CategoryId] Id,[CategoryName] Name, 

    [ActivityId] [Id],[ActivityName] Name,Points, 

    [UserId] [Id],Email, 
    ROW_NUMBER() OVER(ORDER BY Id desc) AS RowNum from 
    (SELECT DISTINCT 
    Id,ParticipantId, 
    ActivityDate,IsApproved, 
    IsDeclined,IsDeleted, 
    SubmissionDate, IsResubmitted, 

    [CategoryId] [CategoryId],[CategoryName] [CategoryName], 

    [ActivityId] [ActivityId],[ActivityName] [ActivityName],Points, 

    [UserId] [UserId],Email, 
    ROW_NUMBER() OVER(ORDER BY Id desc) AS RowNum from 

    (SELECT DISTINCT ASN.Id, 
    ASN.ParticipantId,ASN.ActivityDate, 
    ASN.IsApproved,ASN.IsDeclined, 
    ASN.IsDeleted,ASN.SubmissionDate, 
    CASE WHEN (SELECT COUNT(*) FROM FDS_ActivitySubmission WHERE ParentId=ASN.Id)>0 THEN CONVERT(BIT, 1) ELSE CONVERT(BIT, 0) END IsResubmitted, 

    AC.Id [CategoryId], AC.Name [CategoryName], 

    A.Id [ActivityId],A.Name [ActivityName],A.Points, 

    U.Id[UserId],U.Email  


FROM 
FDS_ActivitySubmission ASN WITH (NOLOCK) 
INNER JOIN 
    FDS_ActivityCategory AC WITH (NOLOCK) 
ON 
    AC.Id=ASN.ActivityCategoryId 
     INNER JOIN 
    FDS_ApproverDetails FDSA 
ON 
FDSA.ParticipantID=ASN.ParticipantID 

     INNER JOIN 
     FDS_ActivityJobRole FAJ 

SUR FAJ.RoleId = FDSA.JobRoleId INNER JOIN

FDS_Activity A WITH (NOLOCK) 
ON 
    A.Id=ASN.ActivityId 
INNER JOIN 
    Users U WITH (NOLOCK) 
ON 
    ASN.ParticipantId=FDSA.ParticipantID 
WHERE 
     [email protected] AND [email protected] AND ASN.IsDeleted=0 
     AND 
     ISNULL(U.Id,0)=ISNULL(@ApproverId,0) 
     AND ISNULL(ASN.IsDeleted,0)<>1)P)t where t.RowNum between 
     (((@PageNumber - 1) * @PageSize) + 1) AND (@PageNumber * PageSize) 
    AND [email protected] AND [email protected] AND t.IsDeleted = 0 
AND (ISNULL(t.Id,0)=ISNULL(@SubmissionId,0)or ISNULL(@SubmissionId,0)<=0) 
+0

Veuillez ne pas seulement poster du code, mais expliquer * pourquoi * et * comment * ce code résout le problème. –