【干货】SqlServer 总结几种存储过程分页的使用
生活随笔
收集整理的這篇文章主要介紹了
【干货】SqlServer 总结几种存储过程分页的使用
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
就我而言寫代碼最煩的就是處理數(shù)據(jù),其中之一就是分頁的使用。
有的代碼寫多了,總結(jié)出一套適用自己的分頁方法;有的查一下資料借鑒一下套用起來也達(dá)到目的。
那么小編在這里給大家總結(jié)幾個方法供大家做一下參考。
分頁方法一:
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO/********************************************************* * 作 用:數(shù)據(jù)分頁 * 作 者:Ozawa * 作者博客:https://www.cnblogs.com/xiongze520/ * 創(chuàng)建日期:2019-05-13 * 使用說明:--調(diào)用例子:--1.單表/單排序EXEC proc_DataPagination @TableNames='bigtable',@PrimaryKey='d_id',@Fields='d_id,d_title,d_content,d_time',@PageSize=20,@CurrentPage=1,@Filter ='',@Group='',@Order='d_id desc'--2.單表/多排序EXEC proc_DataPagination 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'--3.多表/單排序EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_id asc'--4.多表/多排序EXEC proc_DataPagination 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id', 'bigtable.d_id', 'bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author', 20, 0, '', '', 'bigtable.d_time asc,bigtable.d_id desc'*********************************************************/ CREATE PROCEDURE [dbo].[proc_DataPagination] @TableNames VARCHAR(200), --表名,可以是多個表,但不能用別名 @PrimaryKey VARCHAR(100), --主鍵,可以為空,但@Order為空時該值不能為空 @Fields VARCHAR(200), --要取出的字段,可以是多個表的字段,可以為空,為空表示select * @PageSize INT, --每頁記錄數(shù) @CurrentPage INT, --當(dāng)前頁,0表示第1頁 @Filter VARCHAR(200) = '', --條件,可以為空,不用填 where @Group VARCHAR(200) = '', --分組依據(jù),可以為空,不用填 group by @Order VARCHAR(200) = '' --排序,可以為空,為空默認(rèn)按主鍵升序排列,不用填 order by AS BEGINDECLARE @SortColumn VARCHAR(200)DECLARE @Operator CHAR(2)DECLARE @SortTable VARCHAR(200)DECLARE @SortName VARCHAR(200)IF @Fields = ''SET @Fields = '*'IF @Filter = ''SET @Filter = 'WHERE 1=1'ELSESET @Filter = 'WHERE ' + @FilterIF @Group <>''SET @Group = 'GROUP BY ' + @GroupIF @Order <> ''BEGINDECLARE @pos1 INT, @pos2 INTSET @Order = REPLACE(REPLACE(@Order, ' asc', ' ASC'), ' desc', ' DESC')IF CHARINDEX(' DESC', @Order) > 0IF CHARINDEX(' ASC', @Order) > 0BEGINIF CHARINDEX(' DESC', @Order) < CHARINDEX(' ASC', @Order)SET @Operator = '<='ELSESET @Operator = '>='ENDELSESET @Operator = '<='ELSESET @Operator = '>='SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order, ' ASC', ''), ' DESC', ''), ' ', '')SET @pos1 = CHARINDEX(',', @SortColumn)IF @pos1 > 0SET @SortColumn = SUBSTRING(@SortColumn, 1, @pos1-1)SET @pos2 = CHARINDEX('.', @SortColumn)IF @pos2 > 0BEGINSET @SortTable = SUBSTRING(@SortColumn, 1, @pos2-1)IF @pos1 > 0 SET @SortName = SUBSTRING(@SortColumn, @pos2+1, @pos1-@pos2-1)ELSESET @SortName = SUBSTRING(@SortColumn, @pos2+1, LEN(@SortColumn)-@pos2)ENDELSEBEGINSET @SortTable = @TableNamesSET @SortName = @SortColumnENDENDELSEBEGINSET @SortColumn = @PrimaryKeySET @SortTable = @TableNamesSET @SortName = @SortColumnSET @Order = @SortColumnSET @Operator = '>='ENDDECLARE @type varchar(50)DECLARE @prec intSELECT @type=t.name, @prec=c.precFROM sysobjects o JOIN syscolumns c on o.id=c.idJOIN systypes t on c.xusertype=t.xusertypeWHERE o.name = @SortTable AND c.name = @SortNameIF CHARINDEX('char', @type) > 0SET @type = @type + '(' + CAST(@prec AS varchar) + ')'DECLARE @TopRows INTSET @TopRows = @PageSize * @CurrentPage + 1print @TopRowsprint @OperatorEXEC(' DECLARE @SortColumnBegin ' + @type + 'SET ROWCOUNT ' + @TopRows + 'SELECT @SortColumnBegin=' + @SortColumn + ' FROM ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + 'SET ROWCOUNT ' + @PageSize + 'SELECT ' + @Fields + ' FROM ' + @TableNames + ' ' + @Filter + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + ' ') ENDGO?
方法二:
/********************************************************* * 作 用:數(shù)據(jù)分頁 * 作 者:Ozawa * 作者博客:https://www.cnblogs.com/xiongze520/ * 創(chuàng)建日期:2019-05-13 * 使用說明: declare @pageCount int exec commonPagination 'job_id,job_desc','jobs','job_id', 'asc','1=1',2,2,@pageCount output --select '總頁數(shù)為:' + str(@pageCount) *********************************************************/CREATE PROCEDURE commonPagination @columns varchar(500), --要顯示的列名,用逗號隔開 @tableName varchar(100), --要查詢的表名 @orderColumnName varchar(100), --排序的列名 @order varchar(50), --排序的方式,升序為asc,降序為 desc @where varchar(100), --where 條件,如果不帶查詢條件,請用 1=1 @pageIndex int, --當(dāng)前頁索引 @pageSize int, --頁大小(每頁顯示的記錄條數(shù)) @pageCount int --總頁數(shù),輸出參數(shù) as begin declare @sqlRecordCount nvarchar(1000) --得到總記錄條數(shù)的語句 declare @sqlSelect nvarchar(1000) --查詢語句 set @sqlRecordCount=N'select @recordCount=count(*) from ' +@tableName + ' where '+ @where declare @recordCount int --保存總記錄條數(shù)的變量 exec sp_executesql @sqlRecordCount,N'@recordCount int output',@recordCount output --動態(tài) sql 傳參 if( @recordCount % @pageSize = 0) --如果總記錄條數(shù)可以被頁大小整除 set @pageCount = @recordCount / @pageSize --總頁數(shù)就等于總記錄條數(shù)除以頁大小 else --如果總記錄條數(shù)不能被頁大小整除 set @pageCount = @recordCount / @pageSize + 1 --總頁數(shù)就等于總記錄條數(shù)除以頁大小加1 set @sqlSelect = N'select '+@columns+' from ( select row_number() over (order by ' +@orderColumnName+' '+@order +') as tempid,* from ' +@tableName+' where '+ @where +') as tempTableName where tempid between ' +str((@pageIndex - 1)*@pageSize + 1 ) +' and '+str( @pageIndex * @pageSize) exec (@sqlSelect) --執(zhí)行動態(tài)Sql end
?
方法三:
create PROCEDURE commonPagination (@TableName VARCHAR(2000), --表名@ReFieldsStr VARCHAR(1000) = '*', --字段名(全部字段為*)@OrderString VARCHAR(200), --排序字段(必須!支持多字段不用加order by)@WhereString VARCHAR(500) = N'', --條件語句(不用加where)@PageSize INT, --每頁多少條記錄@PageIndex INT = 1, --指定當(dāng)前為第幾頁@TotalRecord INT OUTPUT --返回總記錄數(shù) ) ASBEGIN --處理開始點(diǎn)和結(jié)束點(diǎn)DECLARE @StartRecord INT;DECLARE @EndRecord INT;DECLARE @TotalCountSql NVARCHAR(500);DECLARE @SqlString NVARCHAR(2000);SET @StartRecord = (@PageIndex - 1) * @PageSize + 1;SET @EndRecord = @StartRecord + @PageSize - 1;SET @TotalCountSql = N'select @TotalRecord = count(*) from '+@TableName;--總記錄數(shù)語句SET @SqlString = N'(select row_number() over (order by '+@OrderString+') as rowId,'+@ReFieldsStr+' from '+@TableName;--查詢語句-- 判斷條件是否為空IF(@WhereString != ''OR @WhereString != NULL)BEGINSET @TotalCountSql = @TotalCountSql+' where '+@WhereString;SET @SqlString = @SqlString+' where '+@WhereString;END;--返回總記錄數(shù)EXEC sp_executesql@totalCountSql,N'@TotalRecord int out',@TotalRecord OUTPUT;----執(zhí)行主語句SET @SqlString = 'select * from '+@SqlString+') as t where rowId between '+LTRIM(STR(@StartRecord))+' and '+LTRIM(STR(@EndRecord));EXEC (@SqlString);END;?
方式四:
/********************************************************* * 作 用:數(shù)據(jù)分頁 * 作 者:Ozawa * 作者博客:https://www.cnblogs.com/xiongze520/ * 創(chuàng)建日期:2019-05-13 * 使用說明: [USP_GetPageData] 'select * from 表名',1,10 *********************************************************/CREATE PROCEDURE [dbo].[USP_GetPageData] ( @SQLSTR VARCHAR(8000) -- 查詢的SQL語句 , @CURPAGE INT -- 當(dāng)前頁面位置, @PAGESIZE INT -- 頁面顯示的數(shù)據(jù)行數(shù) ) AS BEGINSET NOCOUNT ONDECLARE @P1 INT --游標(biāo), @ROWCOUNT INT, @COUNTPAGE INT, @CurRow INTEXEC sp_cursoropen @P1 OUTPUT, @SQLSTR, @scrollopt = 1, @ccopt = 1, @ROWCOUNT = @ROWCOUNT OUTPUTIF @ROWCOUNT % @PAGESIZE > 0SET @COUNTPAGE = @ROWCOUNT / @PAGESIZE + 1ELSESET @COUNTPAGE = @ROWCOUNT / @PAGESIZEIF @CURPAGE > @COUNTPAGESET @CURPAGE = @COUNTPAGESET @CurRow = (@CURPAGE - 1) * @PAGESIZE + 1SET NOCOUNT OFFSELECT @CURPAGE CURPAEG, @PAGESIZE PageSize, @COUNTPAGE COUNTPAGE, @ROWCOUNT [ROWCOUNT]EXEC sp_cursorfetch @P1, 16, @CurRow, @PAGESIZESET NOCOUNT ONEXEC sp_cursorclose @P1 END
?
還有更多分頁方式,感興趣的可以去查查資料,上面的分頁方式已經(jīng)足夠參考了,
然后結(jié)合自身情況可以寫一個量身定做的分頁方法,后續(xù)直接使用就可以了。
?
轉(zhuǎn)載于:https://www.cnblogs.com/xiongze520/p/10855312.html
總結(jié)
以上是生活随笔為你收集整理的【干货】SqlServer 总结几种存储过程分页的使用的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usbip
- 下一篇: Hibernate 学习笔记(二)——