zoukankan      html  css  js  c++  java
  • 存储过程分页


    /*
    存储过程分页
    */
    CREATE PROCEDURE Proc_Paging
    (
    @TBName NVARCHAR(255) ,
    @SQL nVARCHAR(4000),    --不带排序语句的SQL语句
    @Page int,              --页码
    @RecsPerPage int,       --每页容纳的记录数
    @ID VARCHAR(255),       --需要排序的不重复的ID号 
    @Sort VARCHAR(255) ,     --排序字段及规则
    @PageCount INT OUTPUT          --总页数
    )
    AS 
    BEGIN
     
    DECLARE @sql1 nvarchar(4000)
     
    SET @sql1=N'SELECT @PageCount=COUNT(*)'
      
    +N' FROM '+@tbname  
     
    EXEC sp_executesql @sql1, N'@PageCount int OUTPUT',@PageCount OUTPUT
     
    SET @PageCount=(@PageCount+@RecsPerPage-1)/@RecsPerPage
    END
    BEGIN
    DECLARE @Str nVARCHAR(4000
    SET @Str='SELECT   TOP '+CAST(@RecsPerPage AS VARCHAR(20))+' * FROM ('+@SQL+') T WHERE T.'+@ID+' NOT IN (SELECT   TOP '+CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))+' '+@ID+' FROM ('+@SQL+') T9 ORDER BY '+@Sort+') ORDER BY '+@Sort 
    --PRINT @Str 
    --
    EXEC sp_ExecuteSql @Str
    --
    EXEC @Str
    DECLARE @Str1 NVARCHAR(400
    DECLARE @Str2 NVARCHAR(400)
    SET @Str1 = CAST(@RecsPerPage AS VARCHAR(20))
    SET @Str2 = CAST((@RecsPerPage*(@Page-1)) AS VARCHAR(20))
    EXEC ( N'SELECT   TOP '+@Str1+ N' * FROM ('+@SQL+N') T WHERE T.'+@ID+N' NOT IN (SELECT   TOP '+@Str2+N' '+@ID+N' FROM ('+@SQL+N') T9 ORDER BY '+@Sort+N') ORDER BY '+@Sort ) 
    END
    GO




               CREATE procedure GetNews
                     (
    @pagesize int,
                        
    @pageindex int,
                        
    @docount bit)
                        
    as
                        
    set nocount on
                        
    if(@docount=1)
                        
    select count(id) from news
                        
    else
                        
    begin
                        
    declare @indextable table(id int identity(1,1),nid int)
                        
    declare @PageLowerBound int
                        
    declare @PageUpperBound int
                        
    set @PageLowerBound=(@pageindex-1)*@pagesize
                        
    set @PageUpperBound=@PageLowerBound+@pagesize
                        
    set rowcount @PageUpperBound
                        
    insert into @indextable(nid) select id from news order by addtime desc
                        
    select O.id,O.source,O.title,O.addtime from news O,@indextable t where O.id=t.nid
                        
    and t.id>@PageLowerBound and t.id<=@PageUpperBound order by t.id
                        
    end
                        
    set nocount off
                
    GO



    ------------------------------------
    --用途:分頁存儲過程(對有主鍵的表效率極高)  
    --說明:
    ------------------------------------

    CREATE PROCEDURE UP_GetRecordByPage
        @tblName      varchar(255),       -- 表名
        @fldName      varchar(255),       -- 主鍵字段名
        @PageSize     int = 10,           -- 頁尺寸
        @PageIndex    int = 1,            -- 頁碼
        @IsReCount    bit = 0,            -- 返回記錄總數, 非 0 值則返回
        @OrderType    bit = 0,            -- 設置排序類型, 非 0 值則降序
        @strWhere     varchar(1000) = ''  -- 查詢條件 (注意: 不要加 where)
    AS

    declare @strSQL   varchar(6000)       -- 主語句
    declare @strTmp   varchar(100)        -- 臨時變量
    declare @strOrder varchar(400)        -- 排序類型

    if @OrderType != 0
    begin
        set @strTmp = '<(select min'
        set @strOrder = ' order by [' + @fldName +'] desc'
    end
    else
    begin
        set @strTmp = '>(select max'
        set @strOrder = ' order by [' + @fldName +'] asc'
    end

    set @strSQL = 'select top ' + str(@PageSize) + ' * 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) + ' * from ['
            + @tblName + '] where [' + @fldName + ']' + @strTmp + '(['
            + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' ['
            + @fldName + '] from [' + @tblName + '] where ' + @strWhere + ' '
            + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder

    if @PageIndex = 1
    begin
        set @strTmp =''
        if @strWhere != ''
            set @strTmp = ' where ' + @strWhere

        set @strSQL = 'select top ' + str(@PageSize) + ' * from ['
            + @tblName + ']' + @strTmp + ' ' + @strOrder
    end

    if @IsReCount != 0
        set @strSQL = 'select count(*) as Total from [' + @tblName + ']'+' where ' + @strWhere

    exec (@strSQL)

    GO

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    Project Euler 97 :Large non-Mersenne prime 非梅森大素数
    Project Euler 96:Su Doku 数独
    Project Euler 95:Amicable chains 亲和数链
    Project Euler 94:Almost equilateral triangles 几乎等边的三角形
    Project Euler 93:Arithmetic expressions 算术表达式
    Project Euler 92:Square digit chains 平方数字链
    Project Euler 91:Right triangles with integer coordinates 格点直角三角形
    Project Euler 90:Cube digit pairs 立方体数字对
    Project Euler 89:Roman numerals 罗马数字
    Project Euler 88:Product-sum numbers 积和数
  • 原文地址:https://www.cnblogs.com/Athrun/p/575905.html
Copyright © 2011-2022 走看看