zoukankan      html  css  js  c++  java
  • 一组MSSQL千万数量级分页存储过程

    一:单表分页
    Create    PROCEDURE [dbo].[MS_Pagination]
    /**************************************************************
    ** 千万数量级分页存储过程 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图,不带dbo.
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc (Desc Asc前必须加空格)
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Fields: 字段名
    7.Filter :过滤语句,不带Where 
    8.Group :Group语句,不带Group By
    **************************************************************
    */

    (
    @Tables varchar(1000),
    @PrimaryKey varchar(100),
    @Sort varchar(200= NULL,
    @CurrentPage int = 1,
    @PageSize int = 20,
    @Fields varchar(1000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL
    )
    AS
    SET NOCOUNT ON
    /*默认排序*/
    SET @Sort = RTRIMLTRIM(@Sort) )
    SET @Sort = REPLACEREPLACE(@Sort'['''),']','')
    IF @Sort IS NULL or @Sort = ''
    SET @Sort = @PrimaryKey
    DECLARE @SortTable varchar(100)
    DECLARE @SortName varchar(100)
    DECLARE @strSortColumn varchar(200)
    DECLARE @operator char(2)
    DECLARE @type varchar(100)
    DECLARE @prec int
    DECLARE @SQL1 varchar(4000),@SQL2 varchar(4000)
    /*设定排序语句.*/
    IF CHARINDEX('DESC',@Sort)>0
    BEGIN
    SET @strSortColumn = REPLACE(@Sort' DESC''')
    SET @operator = '<='
    END
    ELSE
    BEGIN
    IF CHARINDEX('ASC'@Sort> 0
    SET @strSortColumn = REPLACE(@Sort' ASC''')
    SET @operator = '>='
    END
    IF CHARINDEX('.'@strSortColumn> 0
    BEGIN
    SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
    END
    ELSE
    BEGIN
    SET @SortTable = @Tables
    SET @SortName = @strSortColumn
    END
    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 @strPageSize varchar(50)
    DECLARE @strStartRow varchar(50)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)
    /*默认当前页*/
    IF @CurrentPage < 1
    SET @CurrentPage = 1
    /*设置分页参数.*/
    SET @strPageSize = CAST(@PageSize AS varchar(50))
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1AS varchar(50))
    /*筛选以及分组语句.*/
    IF @Filter IS NOT NULL AND @Filter != ''
    BEGIN
    SET @strFilter = ' Where ' + @Filter + ' '
    SET @strSimpleFilter = 'AND ' + @Filter + ' '
    END
    ELSE
    BEGIN
    SET @strSimpleFilter = ''
    SET @strFilter = ''
    END
    IF @Group IS NOT NULL AND @Group != ''
    BEGIN
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    END
    ELSE
    BEGIN
    SET @strGroup = ''
    END

    /*执行查询语句*/
    IF @CurrentPage = 1
    BEGIN
        
    SET @SQL1 ='Select top ' + @strPageSize +' '+ @Fields + ' FROM ' + @Tables + @strFilter +@strGroup + ' orDER BY ' + @Sort
        
    SET @SQL2 = ''
    END
    ELSE
    BEGIN
    --分段
    SET @SQL1 = 'DECLARE @S ' + @type + ' SET ROWCOUNT ' + @strStartRow + ' Select @S=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + @strGroup + ' orDER BY ' + @Sort 
    SET @SQL2 = ' SET ROWCOUNT ' + @strPageSize + ' Select ' + @Fields + ' FROM ' + @Tables + ' Where ' + @strSortColumn + @operator + '@S ' + @strSimpleFilter + ' ' + @strGroup + 'ORDER BY ' + @Sort + ''
    END
    PRINT (@SQL1+@SQL2)
    EXEC (@SQL1+@SQL2)


    GO
    ------------------------
    二,双表分页
    Create   PROCEDURE dbo.MS_Pagination_OutJoin

    ** 千万数量级分页存储过程--带外连表 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图,不带dbo.
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc (Desc Asc前必须加空格)
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Fields: 字段名 如:a.id,a.useid,a.*,b.vipname
    7.Filter :过滤语句,不带Where 
    8.Group :Group语句,不带Group By
    9.@OutTable Wap_Consort_vipInfo
    10.@OutJoin a.VIPID=b.VIPID
    ***************************************************************/
    (
    @Tables varchar(1000),
    @PrimaryKey varchar(100),
    @Sort varchar(200= NULL,
    @CurrentPage int = 1,
    @PageSize int = 20,
    @Fields varchar(1000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL,
    @OutTable varchar (100= NULL,
    @OutJoin varchar (100= NULL
    )
    AS
    /*默认排序*/
    SET @Sort = RTRIMLTRIM(@Sort) )
    IF @Sort IS NULL or @Sort = ''
    SET @Sort = @PrimaryKey
    DECLARE @SortTable varchar(100)
    DECLARE @SortName varchar(100)
    DECLARE @strSortColumn varchar(200)
    DECLARE @operator char(2)
    DECLARE @type varchar(100)
    DECLARE @prec int
    DECLARE @SQL1 varchar(4000),@SQL2 varchar(4000)
    /*设定排序语句.*/
    IF CHARINDEX('DESC',@Sort)>0
    BEGIN
    SET @strSortColumn = REPLACE(@Sort' DESC''')
    SET @operator = '<='
    END
    ELSE
    BEGIN
    IF CHARINDEX('ASC'@Sort> 0
    SET @strSortColumn = REPLACE(@Sort' ASC''')
    SET @operator = '>='
    END
    IF CHARINDEX('.'@strSortColumn> 0
    BEGIN
    SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
    END
    ELSE
    BEGIN
    SET @SortTable = @Tables
    SET @SortName = @strSortColumn
    END
    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 @strPageSize varchar(50)
    DECLARE @strStartRow varchar(50)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)
    /*默认当前页*/
    IF @CurrentPage < 1
    SET @CurrentPage = 1
    /*设置分页参数.*/
    SET @strPageSize = CAST(@PageSize AS varchar(50))
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1AS varchar(50))
    /*筛选以及分组语句.*/
    IF @Filter IS NOT NULL AND @Filter != ''
    BEGIN
    SET @strFilter = ' Where ' + @Filter + ' '
    SET @strSimpleFilter = 'AND ' + @Filter + ' '
    END
    ELSE
    BEGIN
    SET @strSimpleFilter = ''
    SET @strFilter = ''
    END
    IF @Group IS NOT NULL AND @Group != ''
    BEGIN
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    END
    ELSE
    BEGIN
    SET @strGroup = ''
    END
    /*执行查询语句*/
    --分段
    SET @SQL1 = 'DECLARE @S ' + @type + ' SET ROWCOUNT ' + @strStartRow + ' Select @S=' + @strSortColumn + ' FROM ' + @Tables + ' a ' + @strFilter + @strGroup + 'ORDER BY ' + @Sort
    SET @SQL2 = ' SET ROWCOUNT ' + @strPageSize + ' Select ' + @Fields + ' FROM ' + @Tables + ' a LEFT OUTER JOIN ' +@OutTable +' b on '+@OutJoin + ' Where a.' + @strSortColumn + @operator + '@S ' + @strSimpleFilter + ' ' + @strGroup + 'ORDER BY a.' + @Sort
    PRINT (@SQL1+@SQL2)
    EXEC (@SQL1+@SQL2)

    GO


    三:三表分页
    Create   PROCEDURE dbo.MS_Pagination_OutJoin2
    ** 千万数量级分页存储过程--带两张外连表 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图,不带dbo.    第一张主表
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc (Desc Asc前必须加空格)
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Fields: 字段名 如:a.id,a.useid,a.*,b.vipname
    7.Filter :过滤语句,不带Where 
    8.Group :Group语句,不带Group By
    9.@OutTable Wap_Consort_vipInfo    第二张表
    10.@OutJoin a.VIPID=b.VIPID
    11.@OutTable2                 第三张表
    12.@OutJoin2 a.UID=c.UID
    ***************************************************************/
    (
    @Tables varchar(100),
    @PrimaryKey varchar(100),
    @Sort varchar(200= NULL,
    @CurrentPage int = 1,
    @PageSize int = 20,
    @Fields varchar(1000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL,
    @OutTable varchar (100= NULL,
    @OutJoin varchar (100= NULL,
    @OutTable2 varchar (100= NULL,
    @OutJoin2 varchar (100= NULL
    )
    AS
    /*默认排序*/
    SET @Sort = RTRIMLTRIM(@Sort) )
    IF @Sort IS NULL or @Sort = ''
    SET @Sort = @PrimaryKey
    DECLARE @SortTable varchar(100)
    DECLARE @SortName varchar(100)
    DECLARE @strSortColumn varchar(200)
    DECLARE @operator char(2)
    DECLARE @type varchar(100)
    DECLARE @prec int
    DECLARE @SQL1 varchar(4000), @SQL2 varchar(4000),@SQL3 varchar(4000)
    /*设定排序语句.*/
    IF CHARINDEX('DESC',@Sort)>0
    BEGIN
    SET @strSortColumn = REPLACE(@Sort' DESC''')
    SET @operator = '<='
    END
    ELSE
    BEGIN
    IF CHARINDEX('ASC'@Sort> 0
    SET @strSortColumn = REPLACE(@Sort' ASC''')
    SET @operator = '>='
    END
    IF CHARINDEX('.'@strSortColumn> 0
    BEGIN
    SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
    SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
    END
    ELSE
    BEGIN
    SET @SortTable = @Tables
    SET @SortName = @strSortColumn
    END
    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 @strPageSize varchar(50)
    DECLARE @strStartRow varchar(50)
    DECLARE @strFilter varchar(1000)
    DECLARE @strSimpleFilter varchar(1000)
    DECLARE @strGroup varchar(1000)
    /*默认当前页*/
    IF @CurrentPage < 1
    SET @CurrentPage = 1
    /*设置分页参数.*/
    SET @strPageSize = CAST(@PageSize AS varchar(50))
    SET @strStartRow = CAST(((@CurrentPage - 1)*@PageSize + 1AS varchar(50))
    /*筛选以及分组语句.*/
    IF @Filter IS NOT NULL AND @Filter != ''
    BEGIN
    SET @strFilter = ' Where ' + @Filter + ' '
    SET @strSimpleFilter = 'AND ' + @Filter + ' '
    END
    ELSE
    BEGIN
    SET @strSimpleFilter = ''
    SET @strFilter = ''
    END
    IF @Group IS NOT NULL AND @Group != ''
    BEGIN
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    END
    ELSE
    BEGIN
    SET @strGroup = ''
    END
    /*执行查询语句*/
    --分段
    SET @SQL1 = 'DECLARE @S ' + @type + ' SET ROWCOUNT ' + @strStartRow + ' Select @S=' + @strSortColumn + ' FROM ' + @Tables + ' a ' + @strFilter + @strGroup + 'ORDER BY ' + @Sort
    SET @SQL2 = ' SET ROWCOUNT ' + @strPageSize + ' Select ' + @Fields + ' FROM ' + @Tables + ' a LEFT OUTER JOIN ' +@OutTable +' b on '+@OutJoin+ '  LEFT OUTER JOIN ' +@OutTable2 +' c on '+@OutJoin2  
    SET @SQL3 =  ' Where a.' + @strSortColumn + @operator + '@S ' + @strSimpleFilter + ' ' + @strGroup + 'ORDER BY a.' + @Sort
    --PRINT (@SQL1+@SQL2+@SQL3)
    EXEC (@SQL1+@SQL2+@SQL3)


    GO
  • 相关阅读:
    陶哲轩实分析 12.5.15 :有限交性质
    opencvresize修改图像尺寸
    opencvflip翻转
    opencvarcLength计算轮廓周长
    opencvLUT查表
    opencvcontourArea计算轮廓面积
    opencvRNG产生随机数
    opencvSVD奇异值分解
    opencvreshape修改行数和通道数
    opencvmean计算均值
  • 原文地址:https://www.cnblogs.com/daxia/p/1015573.html
Copyright © 2011-2022 走看看