SQL Server存儲(chǔ)過程同時(shí)返回分頁結(jié)果集和總數(shù)
前言
好長時(shí)間沒摸數(shù)據(jù)庫了,周末在家寫了個(gè)報(bào)表的存儲(chǔ)過程,一時(shí)間對(duì)使用存儲(chǔ)過程實(shí)現(xiàn)分頁的同時(shí)并計(jì)算出記錄總數(shù)不知道怎么更好的去實(shí)現(xiàn)。按照我們正常的業(yè)務(wù)邏輯,存儲(chǔ)過程數(shù)據(jù)首先是分頁,其次接受若干查詢條件,返回分頁結(jié)果集的同時(shí)還需要返回記錄總數(shù)給客戶端。
我對(duì)于這樣一個(gè)業(yè)務(wù)存儲(chǔ)過程總結(jié)如下:1、內(nèi)核層,通常也就是要查詢的字段或者要計(jì)算的字段,這部分單獨(dú)拿出來。 2、查詢條件層。 如果內(nèi)核只是查詢一些字段的話,條件可以放在查詢條件層拼接。 如果內(nèi)核層完全是統(tǒng)計(jì)業(yè)務(wù)邏輯,那么查詢條件則必須要放在內(nèi)核層,像我們常用的SUM、GROUPBY 業(yè)務(wù)。 3、添加分頁參數(shù)(也就是我們現(xiàn)在多數(shù)用的ROW_NUMBER添加rn參數(shù))。 存儲(chǔ)過程里我們一般會(huì)單獨(dú)聲明每個(gè)部分的變量用于執(zhí)行時(shí)拼接。
存儲(chǔ)過程
CREATE proc [dbo].[usp_manyidu] ( @seatno nvarchar(30), @pageIndex int, @pageSize int, @rsCount int out ) as begin declare @sql nvarchar(max) --拼接內(nèi)核SQL declare @where nvarchar(max)=' where 1=1' --查詢條件拼接字符串 declare @cols nvarchar(max) --查詢字段、計(jì)算字段 declare @sort nvarchar(50) --排序 set @sql=' from dbo.log where seatno is not null and seatno<>'''' group by seatno ' set @cols='seatno,SUM(case when manyidu=0 then 1 else 0 end) as manyi, SUM(case when manyidu=1 then 1 else 0 end) as yiban, SUM(case when manyidu=2 then 1 else 0 end) as bumanyi, SUM(case when manyidu IS null or manyidu='''' then 1 else 0 end) as weipingjia' set @sort='order by seatno' if(@seatno <>'') set @where+=' and seatno='+@seatno declare @strSQL nvarchar(max) set @strSQL=N'select * from (select ROW_NUMBER() over('+@sort+') as tmpid,* from( select * from (select '+@cols+@sql+') as tmpTable1'+@where+') as tmpTable2) as tmpTable3' +' where tmpid between '+STR((@pageIndex-1)*@pageSize+1)+' and '+STR(@pageIndex*@pageSize) print @strSQL exec(@strSQL) set @strSQL='select @total=count(*) from (select '+@cols+@sql+') as tmpTable'+@where print @strSQL exec sp_executesql @strSQL,N'@total int out',@total=@rsCount out end GO
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- sqlserver存儲(chǔ)過程中SELECT 與 SET 對(duì)變量賦值的區(qū)別
- SQL Server 2008 存儲(chǔ)過程示例
- 如何在SQL Server 2008下輕松調(diào)試T-SQL語句和存儲(chǔ)過程
- SqlServer獲取存儲(chǔ)過程返回值的實(shí)例
- 一些SQL Server存儲(chǔ)過程參數(shù)及例子
- sqlserver 存儲(chǔ)過程中If Else的用法實(shí)例
- sqlserver中查找所有包含了某個(gè)文本的存儲(chǔ)過程
- Sql Server中存儲(chǔ)過程中輸入和輸出參數(shù)(簡單實(shí)例 一看就懂)
- sqlserver 各種判斷是否存在(表名、函數(shù)、存儲(chǔ)過程等)
- SQL Server 分頁查詢存儲(chǔ)過程代碼
相關(guān)文章
教你輕松恢復(fù)/修復(fù)SQL Server的MDF文件
下面將主要討論一下后者的備份與恢復(fù)。本文假定您 能熟練使用SQL Server Enterprise Manager(SQL Server企業(yè)管理器)和SQL Server Quwey Analyser(SQL Server查詢分析器)2013-11-11分發(fā)服務(wù)器 系統(tǒng)拋出18483錯(cuò)誤,未能連接服務(wù)器,因?yàn)?'distributor_admin''未定義遠(yuǎn)程登陸
錯(cuò)誤18483,未能連接服務(wù)器,因?yàn)?'distributor_admin '未在該服務(wù)器上定義遠(yuǎn)程登錄。2010-07-07sqlserver中delete、update中使用表別名和oracle的區(qū)別
之所以要用別名,是因?yàn)閣here條件中需要用到子查詢寫一些條件,下面不寫那么復(fù)雜,僅說明一下問題2013-03-03sqlserver 高性能分頁實(shí)現(xiàn)分析
SQLServer中有一個(gè)Set Rowcount的的設(shè)置,它的意思是使命令的處理在響應(yīng)指定的行數(shù)之后停止處理命令,利用這個(gè)特點(diǎn),我們可以借用它來在一個(gè)千萬行級(jí)數(shù)據(jù)表中實(shí)現(xiàn)高性能分頁查詢。2011-04-04SQL?Server?Reporting?Services?匿名登錄的問題及解決方案
這篇文章主要介紹了關(guān)于?SQL?Server?Reporting?Services?匿名登錄的解決方案,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09判斷一個(gè)表的數(shù)據(jù)不在另一個(gè)表中最優(yōu)秀方法
判斷一個(gè)表的數(shù)據(jù)不在另一個(gè)表中最優(yōu)秀方法2009-11-11