sql server分页存储过程

 

sql server分页存储过程

利用表变量实现分页

一、

代码
复制代码
CREATEPROCEDURE[dbo].[GetRecordFromPage]
@SelectListVARCHAR(2000), --欲选择字段列表
@TableSourceVARCHAR(100), --表名或视图表
@SearchConditionVARCHAR(2000), --查询条件
@OrderExpressionVARCHAR(1000), --排序表达式
@PageIndexINT=1, --页号,从0开始
@PageSizeINT=10--页尺寸
AS
BEGINIF
@SelectList ISNULL OR LTRIM(RTRIM(@SelectList)) =''
BEGIN
SET @SelectList='*'
END
PRINT@SelectList
SET @SearchCondition = ISNULL (@SearchCondition,'')
SET @SearchCondition = LTRIM(RTRIM(@SearchCondition))
IF@SearchCondition<>''
BEGINIF
UPPER(SUBSTRING(@SearchCondition,1,5)) <> 'WHERE'
BEGIN
SET @SearchCondition='WHERE '+@SearchCondition
END ENDPRINT@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
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
SET NOCOUNT ONEXECUTE(@SqlQuery) SET NOCOUNT OFFRETURN @@RowCount
END
复制代码

 二

代码
复制代码
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))
IF@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
SET NOCOUNT ONEXECUTE(@SqlQuery)
SET NOCOUNT OFFRETURN@@RowCount
END
复制代码

 代码

复制代码

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))

IF@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语句: 

代码
复制代码
--获取指定页的数据:CREATEPROCEDURE pagination3
@tblName varchar(255), -- 表名
@strGetFields varchar(1000) =''*'', -- 需要返回的列
@fldName varchar(255)='''', -- 排序的字段名
@PageSize int=10, -- 页尺寸
@PageIndex int=1, -- 页码
@doCount bit=0, -- 返回记录总数, 非 0 值则返回
@OrderType bit=0, -- 设置排序类型, 非 0 值则降序
@strWhere varchar(1500) =''''-- 查询条件 (注意: 不要加 where)
AS
declare @strSQL varchar(4000) -- 主语句
declare @strTmp varchar(110) -- 临时变量
declare @strOrder varchar(400) -- 排序类型
if @doCount!=0
begin
if @strWhere!=''''
set @strSQL= "
select count(*) as Total
from[" + @tblName + "]
where "+@strWhere
else set @strSQL= "selectcount(*) as Total from[" + @tblName + "]"
end --以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况:
else
begin
if @OrderType!=0
begin
set @strTmp= "<(selectmin" set@strOrder= " orderby[" + @fldName +"]desc" --如果@OrderType不是0,就执行降序,这句很重要!
end
else
begin
set @strTmp= ">(selectmax" set@strOrder= " orderby[" + @fldName +"]asc"
end
if @PageIndex=1
begin if @strWhere!=''''
set @strSQL= "select top " +str(@PageSize) +" "+@strGetFields+ "         
from[" + @tblName + "] where " +@strWhere+ " " +@strOrder else
set @strSQL= "selecttop " +str(@PageSize) +" "+@strGetFields+ "         
from ["+ @tblName + "] "+@strOrder --如果是第一页就执行以上代码,这样会加快执行速度
end
else
begin--以下代码赋予了@strSQL以真正执行的SQL代码  
set @strSQL = "selecttop " +str(@PageSize) +" "+@strGetFields+ "
from[" + @tblName + "]
where[" + @fldName + "]" +@strTmp+ "(["+ @fldName + "])       
from (select top " +str((@PageIndex-1)*@PageSize) + " ["+ @fldName + "]       
from[" + @tblName + "]" +@strOrder+ ") as tblTmp)"+@strOrder
if @strWhere!=''''
set @strSQL = " select top " +str(@PageSize) +" "+@strGetFields+ " from [" + @tblName + "]
where [" + @fldName + "]" +@strTmp+ "([" + @fldName + "])
from (selecttop " +str((@PageIndex-1)*@PageSize) + " [" + @fldName + "] from [" + @tblName + "] where " +@strWhere+ " " +@strOrder+ ") as tblTmp) and " +@strWhere+ " " +@strOrder
end
end
exec (@strSQL)
GO
原文地址:https://www.cnblogs.com/coolen/p/3070335.html