![](/img/trans.png)
[英]Running a t-sql stored procedure with EXECUTE AS statement with .NET SqlCommand
[英]T-SQL stored procedure with sorting and paging enabled not working properly
我正在使用以下代码:
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
当我使用以下命令执行存储过程时
DECLARE @return_value int
EXEC @return_value = [dbo].[usp_get_all_groups]
@pStartIndex = 0,
@pPageSize = 15,
@pOrderBy = N'GroupCode ASC'
SELECT 'Return Value' = @return_value
我得到了这些未排序的结果。
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
用这个替换你的程序:
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 动态分配给非动态表达式。
似乎有一种误解,即表达式
ORDER BY UserGroups._id + ' DESC'
将导致 SQL Server 应用降序。 它真正做的只是将字符串文字“ DESC”附加到列值,然后按升序对结果进行排序。
您需要在过程中动态创建整个 SELECT 语句,按照 marc_s 的答案中的草图应用 ORDER BY 两次,并使用 sp_executesql 执行该语句。 sp_executesql 还允许您传递@ 参数。
你没有订购你的SELECT
语句...... UserGroups
的内部SELECT
也没有ORDER BY
,外部的SELECT
......你也需要在SELECT
上提供ORDER BY
! (不仅仅是在您的ROW_NUMBER()
函数的OVER()
子句中)
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
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
的ORDER BY
内OVER()
子句仅用于计算Row
值-如果不命令所得到的数据集。
也许这会有所帮助(如果 _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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.