.net 启用排序和分页的T-SQL存储过程工作不正常

.net 启用排序和分页的T-SQL存储过程工作不正常,.net,sql,sql-server,tsql,stored-procedures,.net,Sql,Sql Server,Tsql,Stored Procedures,我正在使用以下代码: ALTER PROCEDURE [dbo].[usp_get_all_groups] -- Add the parameters for the stored procedure here @pStartIndex smallint, @pPageSize tinyint, @pOrderBy varchar AS BEGIN SELECT * FROM (SELECT ROW_NUMBER

我正在使用以下代码:

ALTER PROCEDURE [dbo].[usp_get_all_groups] 
    -- Add the parameters for the stored procedure here
    @pStartIndex smallint,
    @pPageSize tinyint,
    @pOrderBy varchar
AS
BEGIN

 SELECT 
       *
       FROM
        (SELECT ROW_NUMBER() OVER (ORDER BY 
        
        CASE WHEN @pOrderBy='GroupId ASC' THEN UserGroups._id + ' ASC'
             WHEN @pOrderBy='GroupId DESC' THEN UserGroups._id + ' DESC'
             WHEN @pOrderBy='GroupCode ASC' THEN UserGroups.GroupCode + ' ASC'
             WHEN @pOrderBy='GroupCode DESC' THEN UserGroups.GroupCode + ' DESC'
        END        
        ) AS Row, * FROM UserGroups)
       AS StudentsWithRowNumbers
         WHERE Row>= @pStartIndex AND Row <= @pStartIndex + @pPageSize
END
我得到的结果没有分类

Row _id GroupCode   Description Type    IsActive
1   1   CS2009  CS 2009 Batch   S   1
2   2   IT2009  IT 2009 Batch   S   1
3   3   ME2009  ME 2009 Batch   S   1
4   4   EC2009  EC 2009 Batch   S   1
5   5   EE2009  EE 2009 Batch   S   1
6   8   CS_F    CS Faculties    F   1
7   9   IT_F    IT Faculties    F   1
8   10  ME_F    ME Faculties    F   1
9   11  EC_F    EC Faculties    F   1
10  12  EE_F    EE Faculties    F   1
11  13  BSC_F   Basic Science Faculties F   1
12  14  Accounts    Accounts    A   1
13  15  Mgmt    Management  M   1
14  16  Lib Library B   1
15  17  TnP Training & Placement    T   1
你能告诉我还需要什么吗

我尝试过这个,但它也给出了未排序的结果:

SELECT 
        GroupTable._id,
        GroupTable.GroupCode,
        GroupTable.Type,
        GroupTable.Description
       FROM
        (SELECT ROW_NUMBER() OVER (ORDER BY 
        
        CASE WHEN @pOrderBy='GroupId ASC' THEN CONVERT(varchar(20), '_id ASC') 
             WHEN @pOrderBy='GroupId DESC' THEN CONVERT(varchar(20), '_id DESC') 
             WHEN @pOrderBy='GroupCode ASC' THEN CONVERT(varchar(20), @pOrderBy) 
             WHEN @pOrderBy='GroupCode DESC' THEN CONVERT(varchar(20), @pOrderBy) 
        END        
        ) AS Row, * FROM UserGroups)
       AS GroupTable
         WHERE Row>= @pStartIndex AND Row <= @pStartIndex + @pPageSize
       
       Select COUNT(*) as TotalRows from UserGroups where IsActive= 1
你失踪了

@pOrderBy varchar(20) because of this your @pOrderBy has only one char 'G'
另外,选中此项可能有助于您

您没有订购SELECT语句。。。。内部SELECT from用户组和外部SELECT from用户组都没有ORDER BY。。。。您也需要通过选择提供订单!不仅仅是在你的行数函数的OVER子句中


OVER子句中的ORDER BY仅用于计算行值-它不对结果数据集进行排序。

似乎有一种误解,即表达式

ORDER BY UserGroups._id + ' DESC'
将导致SQL Server应用降序。它真正做的只是将字符串literal DESC附加到列值,然后按升序对结果排序


您需要在过程中动态创建整个SELECT语句,按marc_的答案中所示的两倍应用顺序,并使用sp_executesql执行该语句。sp_executesql还允许您传递@parameters。

将您的过程替换为:

ALTER PROCEDURE [dbo].[usp_get_all_groups] 
    -- Add the parameters for the stored procedure here
    @pStartIndex smallint,
    @pPageSize tinyint,
    @pOrderBy varchar(15)
AS
BEGIN

 SELECT *
 FROM
  (SELECT ROW_NUMBER() OVER (ORDER BY 
      CASE WHEN @pOrderBy='GroupId ASC' THEN UserGroups._id END ASC,  
      CASE WHEN @pOrderBy='GroupId DESC' THEN UserGroups._id END DESC,             
      CASE WHEN @pOrderBy='GroupCode ASC' THEN UserGroups.GroupCode END ASC,
      CASE WHEN @pOrderBy='GroupCode DESC' THEN UserGroups.GroupCode END DESC) AS Row, 
      * FROM UserGroups) AS StudentsWithRowNumbers
  WHERE Row>= @pStartIndex AND Row <= @pStartIndex + @pPageSize
  ORDER BY Row      
END

无法将asc和desc动态分配给非动态表达式。

如果id和GroupCode都是同一类型,这可能会有所帮助:

DECLARE @pOrderBy VARCHAR(100),
        @pStartIndex smallint,
        @pPageSize tinyint
SET @pOrderBy='GroupId DESC'
SET @pStartIndex=0
SET @pPageSize=15
SELECT 
    GroupTable._id,
    GroupTable.GroupCode,
    GroupTable.Type,
    GroupTable.Description
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY 
    CASE @pOrderBy
        WHEN 'GroupId ASC'
        THEN UserGroups._id
        WHEN 'GroupCode ASC'
        THEN UserGroups.GroupCode
    END ASC,
    CASE @pOrderBy
        WHEN 'GroupId DESC'
        THEN UserGroups._id
        WHEN 'GroupCode DESC'
        THEN UserGroups.GroupCode
    END DESC    
    ) AS Row, * FROM UserGroups)
AS GroupTable
WHERE 
    Row>= @pStartIndex 
    AND Row <= @pStartIndex + @pPageSize

除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效。在添加以下内容时,我并不期待您@marc_s会给出这样的回答,请先检查一下post@RashmiKantShrivastwa:我永远不会对相关子查询执行此操作,因此我自己也不会使用这些子查询。我会自己使用CTE,它允许内部订单。更新了我的答案…仍然没有给出结果,因为expectedIt应该可以工作,这是语法错误还是排序不正确?现在在您编辑它之后,它已经接受,但行没有得到排序:
ALTER PROCEDURE [dbo].[usp_get_all_groups] 
    -- Add the parameters for the stored procedure here
    @pStartIndex smallint,
    @pPageSize tinyint,
    @pOrderBy varchar(15)
AS
BEGIN

 SELECT *
 FROM
  (SELECT ROW_NUMBER() OVER (ORDER BY 
      CASE WHEN @pOrderBy='GroupId ASC' THEN UserGroups._id END ASC,  
      CASE WHEN @pOrderBy='GroupId DESC' THEN UserGroups._id END DESC,             
      CASE WHEN @pOrderBy='GroupCode ASC' THEN UserGroups.GroupCode END ASC,
      CASE WHEN @pOrderBy='GroupCode DESC' THEN UserGroups.GroupCode END DESC) AS Row, 
      * FROM UserGroups) AS StudentsWithRowNumbers
  WHERE Row>= @pStartIndex AND Row <= @pStartIndex + @pPageSize
  ORDER BY Row      
END
DECLARE @pOrderBy VARCHAR(100),
        @pStartIndex smallint,
        @pPageSize tinyint
SET @pOrderBy='GroupId DESC'
SET @pStartIndex=0
SET @pPageSize=15
SELECT 
    GroupTable._id,
    GroupTable.GroupCode,
    GroupTable.Type,
    GroupTable.Description
FROM
(SELECT ROW_NUMBER() OVER (ORDER BY 
    CASE @pOrderBy
        WHEN 'GroupId ASC'
        THEN UserGroups._id
        WHEN 'GroupCode ASC'
        THEN UserGroups.GroupCode
    END ASC,
    CASE @pOrderBy
        WHEN 'GroupId DESC'
        THEN UserGroups._id
        WHEN 'GroupCode DESC'
        THEN UserGroups.GroupCode
    END DESC    
    ) AS Row, * FROM UserGroups)
AS GroupTable
WHERE 
    Row>= @pStartIndex 
    AND Row <= @pStartIndex + @pPageSize