一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Sql Server - sqlserver 支持定位當前頁,自定義排序的分頁SQL(拒絕動態SQL)

sqlserver 支持定位當前頁,自定義排序的分頁SQL(拒絕動態SQL)

2019-11-23 18:43MSSQL教程網 Sql Server

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 

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 青草福利视频 | 久久久精品免费免费直播 | 奇米狠狠色 | 久久re热在线视频精69 | 国产大片51精品免费观看 | 色菇凉天天综合网 | vod国产成人精品视频 | 日本特级大片 | 日韩在线观看网站 | 任我行视频在线观看国语 | 嘉嘉的丝袜美腿白丝 | 亚洲天堂精品在线 | 成人在线一区二区三区 | 男人含玉势出嫁束器 | 日韩精品成人 | 特黄特黄一级片 | 日本一区二区高清免费不卡 | 国产乱码在线精品可播放 | 亚洲AV无码国产精品色在线看 | china外卖员gay国产xnxx | 亚洲女人国产香蕉久久精品 | 成人啪啪漫画羞羞漫画www网站 | 寡妇一级毛片 | 韩国甜性涩爱在线播放 | 34看网片午夜理 | 免费高清资源黄网站在线观看 | 日本老熟老太hd | 欧美成黑人性猛交xxoo | 国产va免费精品高清在线观看 | 日韩在线观看免费 | 国产成人精品午夜视频' | boobsmilking流奶水野战 | 网友自拍咪咪爱 | 亚洲国产高清一区二区三区 | 乌克兰呦12~14 | 欧美在线高清 | 精品久久久久久久久久久久久久久 | 国产亚洲一级精品久久 | 操比视频| 日本高清中文 | 精品久久久久久久久久久 |