SQL Server存儲過程同時返回分頁結(jié)果集和總數(shù)
前言
好長時間沒摸數(shù)據(jù)庫了,周末在家寫了個報表的存儲過程,一時間對使用存儲過程實現(xiàn)分頁的同時并計算出記錄總數(shù)不知道怎么更好的去實現(xiàn)。按照我們正常的業(yè)務(wù)邏輯,存儲過程數(shù)據(jù)首先是分頁,其次接受若干查詢條件,返回分頁結(jié)果集的同時還需要返回記錄總數(shù)給客戶端。
我對于這樣一個業(yè)務(wù)存儲過程總結(jié)如下:1、內(nèi)核層,通常也就是要查詢的字段或者要計算的字段,這部分單獨拿出來。 2、查詢條件層。 如果內(nèi)核只是查詢一些字段的話,條件可以放在查詢條件層拼接。 如果內(nèi)核層完全是統(tǒng)計業(yè)務(wù)邏輯,那么查詢條件則必須要放在內(nèi)核層,像我們常用的SUM、GROUPBY 業(yè)務(wù)。 3、添加分頁參數(shù)(也就是我們現(xiàn)在多數(shù)用的ROW_NUMBER添加rn參數(shù))。 存儲過程里我們一般會單獨聲明每個部分的變量用于執(zhí)行時拼接。
存儲過程
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) --查詢字段、計算字段
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)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作
這篇文章主要介紹了hive中將string數(shù)據(jù)轉(zhuǎn)為bigint的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-09-09
sql server數(shù)據(jù)庫高可用日志傳送的方法
SQL Server 使用日志傳送,您可以自動將“主服務(wù)器”實例上“主數(shù)據(jù)庫”內(nèi)的事務(wù)日志備份發(fā)送到單獨“輔助服務(wù)器”實例上的一個或多個“輔助數(shù)據(jù)庫”,下面這篇文章主要給大家介紹了關(guān)于sql server數(shù)據(jù)庫高可用日志傳送的相關(guān)資料,需要的朋友可以參考下2018-05-05
SQLServer數(shù)據(jù)庫中開啟CDC導(dǎo)致事務(wù)日志空間被占滿的原因
這篇文章主要介紹了SQLServer數(shù)據(jù)庫中開啟CDC導(dǎo)致事務(wù)日志空間被占滿的原因分析和解決辦法(REPLICATION),需要的朋友可以參考下2017-04-04

