加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

通用sqlserver分页存储过程

发布时间:2020-12-12 13:19:02 所属栏目:MsSql教程 来源:网络整理
导读:通用sqlserver分页存储过程 来自: http://www.cnblogs.com/nzperfect/archive/2007/05/08/738999.html 单主键: CREATE ? PROC ?P_viewPage ???? /**/ /* ????????nzperfect?[no_mIss]?高效通用分页存储过程(双向检索)?2007.5.7??QQ:34813284 ????????敬告

通用sqlserver分页存储过程

来自: http://www.cnblogs.com/nzperfect/archive/2007/05/08/738999.html

单主键:

CREATE ? PROC ?P_viewPage


????
/**/ /*

????????nzperfect?[no_mIss]?高效通用分页存储过程(双向检索)?2007.5.7??QQ:34813284

????????敬告:适用于单一主键或存在唯一值列的表或视图

????????ps:Sql语句为8000字节,调用时请注意传入参数及sql总长度不要超过指定范围

???????????

????
*/


????
@TableName VARCHAR ( 200 ),????? -- 表名

???? @FieldList 2000 显示列名,如果是全部字段则为* @PrimaryKey 100 单一主键或唯一值键 @Where 查询条件?不含'where'字符,如id>10?and?len(userid)>9 @Order 1000 排序?不含'order?by'字符,如id?asc,userid?desc,必须指定asc或desc????????????????????????????????? ????????????????????????????????? 注意当@SortType=3时生效,记住一定要在最后加上主键,否则会让你比较郁闷 @SortType INT ,??????????????? 排序规则?1:正序asc?2:倒序desc?3:多列排序方法 @RecorderCount 记录总数?0:会返回总记录 @PageSize 每页输出的记录数 @PageIndex 当前页数 @TotalCount ?OUTPUT,?????? 记返回总记录 @TotalPageCount ?OUTPUT??? 返回总页数 AS

????
SET ?NOCOUNT? ON IF ? ISNULL ( '' )? = ? 0 RTRIM ( LTRIM ))

????
REPLACE )),0)">' ' )


????
WHILE CHARINDEX > OR ?,255)">BEGIN

????????
)

????????
)????

????
END ?

????????

????????
< 1 > 3 ?? ????????

????
?

????????
PRINT ERR_00 )???????

????????
RETURN ????


????
?( UPPER RIGHT 4 )) != ?ASC AND 5 ?DESC ERR_02 )? DECLARE @new_where1 )

????
@new_where2 @new_order1 )???

????
@new_order2 @new_order3 @Sql 8000 @SqlCount NVARCHAR 4000 @where

????????????
?WHERE?? ELSE ?WHERE? + ?

????????????
?AND? @order 2 ?

????????????????
?ORDER?BY?

????????????????
?? ' @PrimaryKey + ) ????????????

????????????
ASC,0)">{ASC},0)">DESC,0)">{DESC},0)">)????????????

????????????
)

????????????
SUBSTRING LEN - <> * ????????????

????????????????????
)??????????????????????????????

????????????????????
????????????????????

????????????????????

????????????????????

????????????????????????
@FieldList ?

????????????????????????
?

????????????????????????????
))????????????????????????

????????????????????????
?

????????????????????????
+ ))

????????????????????
))?????????????????????

????????????????
????????????

????????
SELECT?@TotalCount=COUNT(*),@TotalPageCount=CEILING((COUNT(*)+0.0)/

????????????????????
CAST )?FROM?

????

????

?????????????
EXEC ?SP_EXECUTESQL? @TotalCount?INT?OUTPUT,@TotalPageCount?INT?OUTPUT

???????????????????????????????
?OUTPUT

????????
SELECT CEILING (( @TotalCount 0.0 / >= 返回第一页数据 ???????????????? SELECT?TOP? STR ?FROM? ?

???????????????????????????????
)?? 返回最后一页数据 ?FROM?( ABS @PageSize * @PageIndex - ))?

???????????????????????????????

???????????????????????????????
?)?AS?TMP? ????????????????????

????????????????
????????

????????
????

????
?? 仅主键正序排序 <= / 正向检索 ????????????????????????

????????????????????????????
?

???????????????????????????????????????
?>?

???????????????????????????????????????
(SELECT?MAX( )?FROM?(SELECT?TOP? ))? ?)?AS?TMP)? 反向检索 ?<? (SELECT?MIN( 仅主键反序排序 )?AS?TMP)? ???????????????????????????????

????????????????????????
?

????????????????????
??

????????????????
?????????????????????????

????????????
多列排序,必须包含主键,且放置最后,否则不处理 ?FROM?(? ?SELECT?TOP? ????

????????????????????????
??

???????????????????????????????????????
)

GO
联合主键的:
?P_public_ViewPage

????
/**/

????????no_mIss?通用分页存储过程?2007.3.1??QQ:34813284

????????适用于联合主键/单主键/存在能确定唯一行列/存在能确定唯一行的多列?(用英文,隔开)

????????调用:

????????????第一页查询时返回总记录和总页数及第一页记录:

????????????EXECUTE?P_public_ViewPage_per?'TableName','col1,col2,col3,col4','pk1,pk2,pk3',

????????????????'col5>0?and?col7<9','pk1?asc,pk2?asc,pk3?asc',10,1,

????????????????@TotalCount?OUTPUT,@TotalPageCount?OUTPUT

????????????其它页调用,比如第89页(假设第一页查询时返回总记录为2000000):

????????????EXECUTE?P_public_ViewPage_per?'TableName',2000000,89,@TotalPageCount?OUTPUT

????
显示列名 单一主键或唯一值键或联合主键列表(用英文,隔开)或能确定唯一行的多列列表(用英文,隔开) 查询条件?不含'where'字符 排序?不含'order?by'字符,用英文,隔开?? 返回记录总数 A.* A. ????????

????????

?

????
@new_where3 @new_where4 @Fields



????
?WHERE?1=1? ?

????????????????????
?AND?A. ?

????????????
LEFT ))

????????????
?=?B. B. ?IS?NULL?AND? ?),

????????????????????????????
?)) ?A? ?

???????????????????????
?A ?A?LEFT?JOIN?(SELECT?TOP? ))?

???????????????????????

???????????????????????
?)B?ON?


GO

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读