.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