zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    java 堆栈 附图
    synchronized、volatile关键字
    Swift随笔
    java |、&、~、>>、<<运算符的作用。
    java双向链表示意图
    java单链表
    List集合的过滤之lambda表达式
    SQL hint作用
    创建触发器的一般语法
    多线程创建方式
  • 原文地址:https://www.cnblogs.com/coolen/p/3070335.html
Copyright © 2011-2022 走看看