【问题标题】:Difficulty in writing Stored Proc to fetch data for Jqgrid Pagination难以编写存储过程以获取 Jqgrid 分页的数据
【发布时间】:2013-10-11 14:34:58
【问题描述】:

我正在使用以下 SQL 过程在我的 Web 应用程序的 JqGrid 中获取用于分页的数据。

ALTER PROCEDURE [dbo].[NewStoredProc] 
(
    @skip int,
    @pageSize int,
    @OrderBy Varchar(20),
    @OrderByDirection Varchar(10)
 )

AS
BEGIN
    DECLARE @records int;
    SET NOCOUNT ON;
    SET @records =(select count(*) from Data where Status='A');

    IF @skip <= 0
        SELECT TOP (@pageSize) * from Data where Status='A' 
        ORDER BY CASE WHEN @OrderBy='Column1' AND @OrderByDirection='D' THEN Column1 END DESC ,CASE WHEN @OrderBy='Column1' AND @OrderByDirection !='D'THEN Column1 END,
                 CASE WHEN @OrderBy='Column2' AND   @OrderByDirection='D' THEN Column2 END DESC ,CASE WHEN @OrderBy='Column2' AND @OrderByDirection !='D'THEN Column2 END,
                 CASE WHEN @OrderBy='Column3' AND   @OrderByDirection='D' THEN Column3 END DESC ,CASE WHEN @OrderBy='Column3' AND @OrderByDirection !='D'THEN Column3 END

    ELSE
        WITH GetAll AS (
           SELECT  * from Data where Status='A')
        ,GetFirst AS (
            SELECT TOP (@skip) *
            FROM GetAll
        ),GetNext AS (
            SELECT TOP (@pageSize) nt.*
            FROM GetAll AS nt
                LEFT OUTER JOIN GetFirst AS f ON f.Col1=nt.Col1
            WHERE f.Col1 IS  NULL)

        SELECT * FROM GetNext;
    RETURN @records;
END

这里的问题是我不能在 WITH 子句中使用OrderBy。但是,我只需要在排序后获取记录。有什么办法可以做到这一点..

简单来说..GetAll数据如何实现order by

【问题讨论】:

    标签: sql-server-2008 stored-procedures jqgrid pagination sql-order-by


    【解决方案1】:

    在我看来,您可以通过在 WITH 子句的 GetFirstGetNext 部分中使用 OrderBy 来修复代码,但在 GetAll 部分中不能。对应的代码大概如下

    ALTER PROCEDURE [dbo].[NewStoredProc] 
    (
        @skip int,
        @pageSize int,
        @OrderBy Varchar(20),
        @OrderByDirection Varchar(10)
     )
    
    AS
    BEGIN
        DECLARE @records int;
        SET NOCOUNT ON;
        SET @records =(select count(*) from Data where Status='A');
    
        IF @skip <= 0
            SELECT TOP (@pageSize) * from Data where Status='A' 
            ORDER BY CASE WHEN @OrderBy='Column1' AND @OrderByDirection='D'
                          THEN Column1
                     END DESC,
                     CASE WHEN @OrderBy='Column1' AND @OrderByDirection !='D'
                          THEN Column1
                     END,
                     CASE WHEN @OrderBy='Column2' AND @OrderByDirection='D'
                          THEN Column2
                     END DESC,
                     CASE WHEN @OrderBy='Column2' AND @OrderByDirection !='D'
                          THEN Column2
                     END,
                     CASE WHEN @OrderBy='Column3' AND @OrderByDirection='D'
                          THEN Column3
                     END DESC,
                     CASE WHEN @OrderBy='Column3' AND @OrderByDirection !='D'
                          THEN Column3
                     END
        ELSE
            WITH GetAll AS (
                SELECT * from Data where Status='A'
            ),GetFirst AS (
                SELECT TOP (@skip) *
                FROM GetAll
                ORDER BY CASE WHEN @OrderBy='Column1' AND @OrderByDirection='D'
                              THEN Column1
                         END DESC,
                         CASE WHEN @OrderBy='Column1' AND @OrderByDirection !='D'
                              THEN Column1
                         END,
                         CASE WHEN @OrderBy='Column2' AND @OrderByDirection='D'
                              THEN Column2
                         END DESC,
                         CASE WHEN @OrderBy='Column2' AND @OrderByDirection !='D'
                              THEN Column2
                         END,
                         CASE WHEN @OrderBy='Column3' AND @OrderByDirection='D'
                              THEN Column3
                         END DESC,
                         CASE WHEN @OrderBy='Column3' AND @OrderByDirection !='D'
                              THEN Column3
                         END
            ),GetNext AS (
                SELECT TOP (@pageSize) nt.*
                FROM GetAll AS nt
                    LEFT OUTER JOIN GetFirst AS f ON f.Col1=nt.Col1
                WHERE f.Col1 IS  NULL
                ORDER BY CASE WHEN @OrderBy='Column1' AND @OrderByDirection='D'
                              THEN nt.Column1
                         END DESC,
                         CASE WHEN @OrderBy='Column1' AND @OrderByDirection !='D'
                              THEN nt.Column1
                         END,
                         CASE WHEN @OrderBy='Column2' AND @OrderByDirection='D'
                              THEN nt.Column2
                         END DESC,
                         CASE WHEN @OrderBy='Column2' AND @OrderByDirection !='D'
                              THEN nt.Column2
                         END,
                         CASE WHEN @OrderBy='Column3' AND @OrderByDirection='D'
                              THEN nt.Column3
                         END DESC,
                         CASE WHEN @OrderBy='Column3' AND @OrderByDirection !='D'
                              THEN nt.Column3
                         END
            )  
            SELECT * FROM GetNext
    
        RETURN @records;
    END
    

    【讨论】:

    • 谢谢奥列格..再一次..:)
    猜你喜欢
    • 1970-01-01
    • 2013-07-11
    • 2010-09-20
    • 2011-02-12
    • 2014-01-30
    • 2019-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多