zoukankan      html  css  js  c++  java
  • 分页存储过程,可支持多表查询

    注意:该存储过程处理逻辑被发现有严重错误,并不能实现 任意排序等功能。


    /*
    说明:1.支持多表查询 2.支持任意排序 3.不支持表别名
    参考了
        evafly920:[分享]千万数量级分页存储过程(效果演示)
        地址:http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx 

    IF(EXISTS(SELECT * FROM sysobjects WHERE [id]=OBJECT_ID('usp_PagingLarge') AND xtype='P'))
        DROP PROCEDURE usp_PagingLarge
    */


    GO

    CREATE PROCEDURE usp_PagingLarge
    @TableNames VARCHAR(200),    --表名,可以是多个表,但不能用别名
    @PrimaryKey VARCHAR(100),    --主键,可以为空,但@Order为空时该值不能为空
    @Fields    VARCHAR(200),        --要取出的字段,可以是多个表的字段,可以为空,为空表示select *
    @PageSize INT,            --每页记录数
    @CurrentPage INT,        --当前页,0表示第1页
    @Filter VARCHAR(200= '',    --条件,可以为空,不用填 where
    @Group VARCHAR(200= '',    --分组依据,可以为空,不用填 group by
    @Order VARCHAR(200= ''    --排序,可以为空,为空默认按主键升序排列,不用填 order by
    AS
    BEGIN
        
    DECLARE @SortColumn VARCHAR(200)
        
    DECLARE @Operator CHAR(2)
        
    DECLARE @SortTable VARCHAR(200)
        
    DECLARE @SortName VARCHAR(200)
        
    IF @Fields = ''
            
    SET @Fields = '*'
        
    IF @Filter = ''
            
    SET @Filter = 'WHERE 1=1'
        
    ELSE
            
    SET @Filter = 'WHERE ' +  @Filter
        
    IF @Group <>''
            
    SET @Group = 'GROUP BY ' + @Group

        
    IF @Order <> ''
        
    BEGIN
            
    DECLARE @pos1 INT@pos2 INT
            
    SET @Order = REPLACE(REPLACE(@Order' asc'' ASC'), ' desc'' DESC')
            
    IF CHARINDEX(' DESC'@Order> 0
                
    IF CHARINDEX(' ASC'@Order> 0
                
    BEGIN
                    
    IF CHARINDEX(' DESC'@Order< CHARINDEX(' ASC'@Order)
                        
    SET @Operator = '<='
                    
    ELSE
                        
    SET @Operator = '>='
                
    END
                
    ELSE
                    
    SET @Operator = '<='
            
    ELSE
                
    SET @Operator = '>='
            
    SET @SortColumn = REPLACE(REPLACE(REPLACE(@Order' ASC'''), ' DESC'''), ' ''')
            
    SET @pos1 = CHARINDEX(','@SortColumn)
            
    IF @pos1 > 0
                
    SET @SortColumn = SUBSTRING(@SortColumn1@pos1-1)
            
    SET @pos2 = CHARINDEX('.'@SortColumn)
            
    IF @pos2 > 0
            
    BEGIN
                
    SET @SortTable = SUBSTRING(@SortColumn1@pos2-1)
                
    IF @pos1 > 0 
                    
    SET @SortName = SUBSTRING(@SortColumn@pos2+1@pos1-@pos2-1)
                
    ELSE
                    
    SET @SortName = SUBSTRING(@SortColumn@pos2+1LEN(@SortColumn)-@pos2)
            
    END
            
    ELSE
            
    BEGIN
                
    SET @SortTable = @TableNames
                
    SET @SortName = @SortColumn
            
    END
        
    END
        
    ELSE
        
    BEGIN
            
    SET @SortColumn = @PrimaryKey
            
    SET @SortTable = @TableNames
            
    SET @SortName = @SortColumn
            
    SET @Order = @SortColumn
            
    SET @Operator = '>='
        
    END

        
    DECLARE @type varchar(50)
        
    DECLARE @prec int
        
    SELECT @type=t.name, @prec=c.prec
        
    FROM sysobjects o 
        
    JOIN syscolumns c on o.id=c.id
        
    JOIN systypes t on c.xusertype=t.xusertype
        
    WHERE o.name = @SortTable AND c.name = @SortName
        
    IF CHARINDEX('char'@type> 0
        
    SET @type = @type + '(' + CAST(@prec AS varchar+ ')'

        
    DECLARE @TopRows INT
        
    SET @TopRows = @PageSize * @CurrentPage + 1
        
    print @TopRows
        
    print @Operator
        
    EXEC('
            DECLARE @SortColumnBegin 
    ' + @type + '
            SET ROWCOUNT 
    ' + @TopRows + '
            SELECT @SortColumnBegin=
    ' + @SortColumn + ' FROM  ' + @TableNames + ' ' + @Filter + ' ' + @Group + ' ORDER BY ' + @Order + '
            SET ROWCOUNT 
    ' + @PageSize + '
            SELECT 
    ' + @Fields + ' FROM  ' + @TableNames + ' ' + @Filter  + ' AND ' + @SortColumn + '' + @Operator + '@SortColumnBegin ' + @Group + ' ORDER BY ' + @Order + '    
        
    ')    
    END

    GO

    --调用例子:
        --1.单表/单排序
        EXEC usp_PagingLarge 'bigtable','d_id','d_id,d_title,d_content,d_time',20,1,'','','d_id desc'
        
    --2.单表/多排序
        EXEC usp_PagingLarge 'bigtable','d_id','*',20,0,'','','d_time asc,d_id desc'
        
    --3.多表/单排序
        EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id''bigtable.d_id''bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author'200'''''bigtable.d_id asc'
        
    --4.多表/多排序
        EXEC usp_PagingLarge 'bigtable left join bigtable_author on bigtable.d_id=bigtable_author.BigTable_id''bigtable.d_id''bigtable.d_id,bigtable.d_title,bigtable.d_content,bigtable.d_time,bigtable_author.d_author'200'''''bigtable.d_time asc,bigtable.d_id desc'


    [转]: http://jiny-z.cnblogs.com/archive/2006/04/12/373146.aspx

    下面有个实例,挺不错的

    http://www.dmblogs.com/nzBlog/article.asp?id=25
    http://topic.csdn.net/u/20080627/12/4a404bb1-6667-466a-925a-4d7bf690695e.html?1194652084

    http://blog.csdn.net/evafly920/archive/2006/03/03/614813.aspx

  • 相关阅读:
    bzoj-2748 2748: [HAOI2012]音量调节(dp)
    bzoj-2338 2338: [HNOI2011]数矩形(计算几何)
    bzoj-3444 3444: 最后的晚餐(组合数学)
    codeforces 709E E. Centroids(树形dp)
    codeforces 709D D. Recover the String(构造)
    codeforces 709C C. Letters Cyclic Shift(贪心)
    codeforces 709B B. Checkpoints(水题)
    codeforces 709A A. Juicer(水题)
    Repeat Number
    hdu 1003 Max Sum (动态规划)
  • 原文地址:https://www.cnblogs.com/sainaxingxing/p/1306586.html
Copyright © 2011-2022 走看看