通用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
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|