sql server分页存储过程
利用表变量实现分页
一、

DECLARE @SqlQuery VARCHAR(4000)
SET @SqlQuery='SELECT '+@SelectList+',RowNumber FROM (SELECT '+@SelectList+',ROW_NUMBER() OVER( '+@OrderExpression+') AS RowNumber FROM '+@TableSource+''+@SearchCondition+') AS RowNumberTableSource WHERE RowNumber BETWEEN '+CAST(((@PageIndex-1)*@PageSize+1) ASVARCHAR) +' AND '+CAST((@PageIndex*@PageSize) ASVARCHAR)
二

SET @OrderExpression=ISNULL(@OrderExpression,'')
IF @PageIndex ISNULL OR @PageIndex<1
DECLARE @SqlQuery VARCHAR(4000)
SET @SqlQuery='SELECT '+@SelectList+',RowNumber FROM (SELECT '+@SelectList+',ROW_NUMBER() OVER( '+@OrderExpression+') AS RowNumber FROM '+@TableSource+''+@SearchCondition+') AS RowNumberTableSource WHERE RowNumber BETWEEN '+CAST(((@PageIndex-1)*@PageSize+1) ASVARCHAR) +' AND '+CAST((@PageIndex*@PageSize) ASVARCHAR)
代码
复制代码
CREATEPROCEDURE[dbo].[GetRecordFromPage]
@SelectList VARCHAR(2000), --欲选择字段列表
@TableSource VARCHAR(100), --表名或视图表
@SearchCondition VARCHAR(2000), --查询条件
@OrderExpressionVARCHAR(1000), --排序表达式
@PageIndex INT=1, --页号,从0开始
@PageSize INT=10--页尺寸
AS
BEGIN
IF @SelectList ISNULL OR LTRIM(RTRIM(@SelectList)) =''
BEGIN
SET @SelectList='*'
END PRINT @SelectList
SET @SearchCondition=ISNULL(@SearchCondition,'')
SET @SearchCondition=LTRIM(RTRIM(@SearchCondition))
BEGIN
IF UPPER(SUBSTRING(@SearchCondition,1,5)) <>'WHERE'
BEGIN
SET @SearchCondition='WHERE '+@SearchCondition
END
END PRINT@SearchCondition
SET @OrderExpression=ISNULL(@OrderExpression,'')
SET @OrderExpression=LTRIM(RTRIM(@OrderExpression))
IF @OrderExpression<>''
BEGIN IF UPPER(SUBSTRING(@OrderExpression,1,5)) <>'WHERE'
BEGIN
SET @OrderExpression='ORDER BY '+@OrderExpression
END END PRINT@OrderExpression
IF @PageIndex ISNULL OR @PageIndex<1
BEG INSET @PageIndex=1
END PRINT@PageIndex
IF @PageSize ISNULL OR @PageSize<1
BEGIN SET @PageSize=10
END PRINT @PageSize
DECLARE @SqlQuery VARCHAR(4000)
SET @SqlQuery='SELECT '+@SelectList+',RowNumber FROM (SELECT '+@SelectList+',ROW_NUMBER() OVER( '+@OrderExpression+') AS RowNumber FROM '+@TableSource+''+@SearchCondition+') AS RowNumberTableSource WHERE RowNumber BETWEEN '+CAST(((@PageIndex-1)*@PageSize+1) ASVARCHAR) +'AND '+CAST((@PageIndex*@PageSize) ASVARCHAR)
PRINT @SqlQuery
SETNOCOUNT ONEXECUTE(@SqlQuery)
SETNOCOUNT OFFRETURN@@RowCount
END
复制代码
三、
从数据表中取出第n条到第m条的记录的方法
从publish 表中取出第 n 条到第 m 条的记录:
SELECT TOP m-n+1 *
FROM publish
WHERE (id NOT IN
(SELECT TOP n-1 id
FROM publish))
id 为publish 表的关键字
------------------------
分页方案:
select top 页大小 *
from table1
where id>
(select max (id) from
(select top ((页码-1)*页大小) id from table1 order by id) as T
)
order by id
全部的sql语句:

declare @strSQL varchar(4000) -- 主语句
if @PageIndex=1
set @strSQL= "select top " +str(@PageSize) +" "+@strGetFields+ "
set @strSQL= "selecttop " +str(@PageSize) +" "+@strGetFields+ "
if @strWhere!=''''
end
exec (@strSQL)
GO