2010-02-11 23 views

risposta

34

Si può provare qualcosa di simile

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

Penso che questo codice dosn't lavoro. Hai testato questo codice? (dovrebbe sostituire la tabella "PageNumbers" con "@Table". – RockOnGom

+0

@zeitgeist, sta facendo uso di un CTE chiamato PageNumbers. Hai provato il codice così com'è? –

33

È possibile utilizzare ROW_NUMBER():

Restituisce il numero sequenziale di una riga all'interno di una partizione di un set di risultati, a partire da 1 per la prima riga in ogni partizione.

Esempio:

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) Creare MANICHINO DI DATI

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) SOCIETÀ applicare la soluzione.

Questo caso presuppone che EMPID sia una colonna univoca e ordinata.

fuori Naturalmente, si dovrà applicare una colonna diversa ...

DECLARE @pageSize INT = 20 

SELECT * FROM (

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

WHERE MyQuery.PageNumber = 1   
+0

Approccio bello ma aggiungere una nuova colonna potrebbe essere un sovraccarico –

12

SQL Server 2012 fornisce funzionalità di paginazione (vedi http://www.codeproject.com/Articles/442503/New-features-for-database-developers-in-SQL-Server)

In SQL2008 si può fare in questo modo:

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! Funziona e scala in modo coerente.

0

Queste sono la mia soluzione per il paging del risultato della query sul lato SQL server. Ho aggiunto il concetto di filtraggio e ordine con una colonna. È molto efficiente quando si esegue il paging, si filtrano e si ordinano in Gridview.

Prima di provare, devi creare una tabella di esempio e inserire alcune righe in questa tabella:

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 

Nel server SQL 2008, è possibile utilizzare il concetto CTE.A causa di ciò, ho scritto due tipi di query per SQL Server 2008+

- 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 

E seconda soluzione SQL con CTE in 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. 

;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

Selezionare 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 

ON 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

Si prega di inserire non solo del codice, ma di spiegare * perché * e * come * questo codice risolve il problema. –