sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)

1,场景:根据学生编号查询,返回该学生所在班级的所有学生。支持分页、自定义排序及结果集自动定位到查询条件的学生编号所在页。

复制代码 代码如下:

CREATE PROC [dbo].[Sp_testpagerandsorting] (@GroupID INT,

@CurrentId INT,

@TimeFrom DATETIME,

@TimeTo DATETIME,

@OrderBy CHAR(50),

@PageSize INT,

@CurrentPage INT)

AS

SET nocount ON

BEGIN

DECLARE @StartNumber INT,

@EndNumber INT,

@CurrentIdRowNumber INT,

@RecordCount INT,

@EndPageIndex INT

DECLARE @RowNumberTable TABLE (

rownumber INT IDENTITY (1, 1),

id INT )

--step 1: Build sort id list -------------------------------------------------------

INSERT INTO @RowNumberTable

(id)

SELECT sm.id AS id

FROM dbo.test sm WITH (nolock)

WHERE indate BETWEEN Coalesce(@TimeFrom, indate) AND

Coalesce(@TimeTo, indate)

AND sm.groupid = @GroupID

ORDER BY CASE

WHEN @OrderBy = 'InDate desc' THEN ( Row_number() OVER (ORDER BY indate DESC))

WHEN @OrderBy = 'InDate asc' THEN (Row_number() OVER (ORDER BY indate ASC))

WHEN @OrderBy = 'Id asc' THEN (Row_number() OVER (ORDER BY sm.id ASC))

WHEN @OrderBy = 'Id desc' THEN (Row_number() OVER (ORDER BY sm.id DESC))

WHEN @OrderBy = 'Name asc' THEN (Row_number() OVER (ORDER BY sm.name ASC))

WHEN @OrderBy = 'Name desc' THEN (Row_number() OVER (ORDER BY sm.name DESC) )

END

--step 2: Reset page index with current id -----------------------------------------

IF @CurrentIdNumber > 0

BEGIN

SELECT TOP 1 @CurrentIdRowNumber = rownumber

FROM @RowNumberTable

WHERE id = @CurrentIdNumber

IF @CurrentIdRowNumber > 0

BEGIN

IF @CurrentPage = 0

BEGIN

SET @CurrentPage = Ceiling(CAST(@CurrentIdRowNumber AS DECIMAL) / CAST (@PageSize AS DECIMAL))

END

END

END

ELSE

BEGIN

IF @CurrentPage = 0

BEGIN

SET @CurrentPage = 1

END

END

--step 3: Set recordCount -----------------------------------------

SELECT @RecordCount = COUNT(1)

FROM @RowNumberTable

--step 4: Calc startNumber & endNumber -----------------------------------------

SELECT @StartNumber = @PageSize * ( @CurrentPage - 1 ),

@EndNumber = @PageSize * ( @CurrentPage - 1 ) + @pageSize,

@EndPageIndex = Ceiling(CAST(@RecordCount AS DECIMAL) / CAST(@PageSize AS DECIMAL))

IF @CurrentPage = @EndPageIndex

BEGIN

SET @EndNumber = @RecordCount

END

--step 5: Get sorted id of current page -----------------------------------------

;WITH a

AS (SELECT TOP (@EndNumber - @StartNumber) id,

rownumber

FROM (SELECT TOP (@EndNumber) id,

rownumber

FROM @RowNumberTable) AS b

ORDER BY rownumber DESC)

--step 6: Return current page idList -------------------------------------------------------

SELECT [ID],

[GroupID] [Name],

[Address]

FROM dbo.test sm WITH(nolock)

INNER JOIN a

ON a.id = sm.id

ORDER BY a.rownumber

-- step 7:return current page & record count ----------------------------------

SELECT @CurrentPage AS currentpage,

@RecordCount AS recordcount

END

2,简单条件的,动态where语句(关于Like查询的动态where,建议使用笨办法做)

复制代码 代码如下:

CREATE PROC [dbo].[Getstudentlistbycondition] @Name NVARCHAR(20),

@Class INT

AS

SET nocount ON

BEGIN

BEGIN

SELECT [Name],

[class]

FROM [testtable]

WHERE [Class] = CASE

WHEN @Class > 0 THEN @Class ELSE [Class] END

AND [name] = CASE

WHEN @Name <> '' THEN @Name ELSE [Name] END

END

END

时间: 2024-11-01 07:58:05

sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)的相关文章

sqlserver 支持定位当前页,自定义排序的分页SQL(拒绝动态SQL)_MsSql

1,场景:根据学生编号查询,返回该学生所在班级的所有学生.支持分页.自定义排序及结果集自动定位到查询条件的学生编号所在页. 复制代码 代码如下: CREATE PROC [dbo].[Sp_testpagerandsorting] (@GroupID INT, @CurrentId INT, @TimeFrom DATETIME, @TimeTo DATETIME, @OrderBy CHAR(50), @PageSize INT, @CurrentPage INT) AS SET nocoun

支持任意排序的分页存储过程(asp.net/sqlserver)

 代码如下 复制代码 ------------------------------------  --用途:支持任意排序的分页存储过程  --说明:  ------------------------------------    CREATE PROCEDURE [dbo].[UP_GetRecordByPageOrder]    @tblName varchar(255),   -- 表名  @fldName varchar(255),   -- 显示字段名  @OrderfldName v

简单好用的ASP.NET分页类(支持AJAX、自定义文字)

  这篇文章主要介绍了简单好用的ASP.NET分页类(支持AJAX.自定义文字),本文直接给出实现代码和使用方法,需要的朋友可以参考下 在做网站没用 JS UI控件时 很实用 用法: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 var ps=new PageString();   /*可选参数*/   ps.SetIsEnglish = true;// 是否是英文 (默认:false) ps.SetIsShowText = true;//是

简单好用的ASP.NET分页类(支持AJAX、自定义文字)_实用技巧

在做网站没用 JS UI控件时 很实用 用法: var ps=new PageString(); /*可选参数*/ ps.SetIsEnglish = true;// 是否是英文 (默认:false) ps.SetIsShowText = true;//是否显示分页文字 (默认:true) //ps.TextFormat="" (默认值:<span class=\"pagetext\"><strong>总共</strong>:{0

XML创建可排序、分页的数据显示页面

xml|创建|分页|排序|数据|显示|页面 在web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:asp.php.jsp等.然而,如果要在客户端显示多条记录并且排序是一件很令人头疼的事情.下面,我们利用extensible markup language(xml,可扩展标记语言)和extensible stylesheet language transformations(xslt,可扩展样式单语言转换),并结合xml p

用XML创建可排序、分页的数据显示页面

xml|创建|分页|排序|数据|显示|页面   <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />        在Web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:ASP.PHP.JSP等.然而,如果要在客户端显示多条记录并且排序是一件很令人头疼的事情.下面,我们利用Extensible Mark

XML创建可排序、分页的数据显示页面_XML/RSS

在Web开发中,我们经常会遇到分页显示和排序数据记录集的情况,这在服务器端使用服务器端的代码和数据库技术是件很轻松的事情,比如:ASP.PHP.JSP等.然而,如果要在客户端显示多条记录并且排序是一件很令人头疼的事情.下面,我们利用Extensible Markup Language(XML,可扩展标记语言)和Extensible Stylesheet Language Transformations(XSLT,可扩展样式单语言转换),并结合XML Path Language(XPath,XML

Java集合框架实现自定义排序

Java集合框架针对不同的数据结构提供了多种排序的方法,虽然很多时候我们可以自己实现排序,比如数组等,但是灵活的使用JDK提供的排序方法,可以提高开发效率,而且通常JDK的实现要比自己造的轮子性能更优化. 1.使用Arrays对数组进行排序 Java API对Arrays类的说明是:此类包含用来操作数组(比如排序和搜索)的各种方法. (1)使用Arrays排序 Arrays使用非常简单,直接调用sort()即可: 1 2 3 4 5 6 7 8 9 10 11 int[] arr = new i

在ASP.NET 2.0中操作数据之二十七:创建自定义排序用户界面_自学过程

简介 显示大量已经按类别(不是很多)排序的数据但没有类别分界线,用户很难找到所需要的类别.例如,数据库中只有9个类别(8个不同的类别和1个null),共81种产品.现在用一个GridView列出所有产品,假设有用户对类别Seafood的产品感兴趣,她一定会按类别排序,把Seafood产品排列在一起.排序后,用户便寻找Seafood产品开始和结束的地方.虽然是按英文字母排列类别不难找到Seafood,但仍要花些时间在GridView寻找.为了进一步的区分类别,许多网站使用类别分界线这种排序用户界面