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'
    与自定义分页结合例子:
    /Files/jiny-z/Paging_Custom.rar
    alter PROCEDURE SP_Pagination
    /*
    ***************************************************************
    ** 分页存储过程 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Fields:字段
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group By
    8.docount: 1返回总行数,0返回列表

    **************************************************************
    */

    (
    @Tables varchar(1000),
    @PrimaryKey varchar(100),
    @Sort varchar(200= NULL,
    @CurrentPage int = 1,
    @PageSize int = 10,
    @Fields varchar(1000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL,
    @docount bit = 0
    )
    AS
    /*默认排序*/
    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


    /*设定排序语句.*/
    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(200)
    DECLARE @strSimpleFilter varchar(200)
    DECLARE @strGroup varchar(200)

    /*默认当前页*/
    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 != ''
     
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    ELSE
     
    SET @strGroup = ''

     

    declare @cTemp NVarChar(1000)
    declare @PageCount int,  @lineCount decimal

    CREATE TABLE #temp(linecount INT)

    set @cTemp = 'insert into #temp (linecount)  select  count(*)  FROM ' + @Tables +  @strFilter + ' ' + @strGroup 
     
    exec (@cTemp)

    select @lineCount = linecount from #temp

    drop table #temp


    if(@docount=1)  
     
    begin
      
    select @lineCount '总行数' 
     
    end
    else  

    begin
     
     
    --得到总页数
     set @PageCount = CEILING(@lineCount/@strPageSize)
     
    if @CurrentPage > @PageCount
      
    begin
       
    set @cTemp = 'SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE 1>2 ' 
      
    end
     
    else
      
    begin
       
       
    /*执行查询语句*/
       
       
    set @cTemp = 'DECLARE @SortColumn ' + @type + '
       SET ROWCOUNT 
    ' + @strStartRow + '
       SELECT @SortColumn=
    ' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
       SET ROWCOUNT 
    ' + @strPageSize + '
       SELECT 
    ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ''
       
      
    end

     
    --print @cTemp
     EXEC(@cTemp)
    end 

    -----------------------------------------------------

    分页查询的方法已经很多很多,在这里我也加入成为其中一员。
          SQL Server中有一个Set Rowcount的的设置,它的意思是使命令的处理在响应指定的行数之后停止处理命令,利用这个特点,我们可以借用它来在一个千万行级数据表中实现高性能分页查询。先来说说实现方式:
          
    1、我们来假定Table中有一个已经建立了索引的主键字段ID(整数型),我们将按照这个字段来取数据进行分页。
          
    2、页的大小我们放在@PageSize中
          
    3、当前页号我们放在@CurrentPage中
          
    4、如何让记录指针快速滚动到我们要取的数据开头的那一行呢,这是关键所在!有了Set RowCount,我们就很容易实现了。
          
    5、如果我们成功地滚动记录指针到我们要取的数据的开头的那一行,然后我们把那一行的记录的ID字段的值记录下来,那么,利用Top和条件,我们就很容易的得到指定页的数据了。当然,有了Set RowCount,我们难道还用Top么?
          看看Set Rowcount怎么来帮我们的忙吧:

    Declare @ID int
    Declare @MoveRecords int

    --@CurrentPage和@PageSize是传入参数
    Set @MoveRecords=@CurrentPage * @PageSize+1

    --下面两行实现快速滚动到我们要取的数据的行,并把ID记录下来
    Set Rowcount @MoveRecords
    Select @ID=ID from Table1 Order by ID

    Set Rowcount @PageSize
    --最恨为了减少麻烦使用*了,但是在这里为了说明方便,暂时用一下
    Select * From Table1 Where ID>=@ID Order By ID
    Set Rowcount 0
          大家可以试试看,在一个1千W记录的表里面,一下子方翻页到第100页(每页100条),看看有多快!
    分享]千万数量级分页存储过程(带效果演示)
    效果演示:http:
    //www.cn5135.com/_App/Opportunities/QueryResult.aspx

    CREATE PROCEDURE CN5135_SP_Pagination
    /*
    ***************************************************************
    ** 千万数量级分页存储过程 **
    ***************************************************************
    参数说明:
    1.Tables :表名称,视图
    2.PrimaryKey :主关键字
    3.Sort :排序语句,不带Order By 比如:NewsID Desc,OrderRows Asc
    4.CurrentPage :当前页码
    5.PageSize :分页尺寸
    6.Filter :过滤语句,不带Where 
    7.Group :Group语句,不带Group By
    效果演示:http://www.cn5135.com/_App/Opportunities/QueryResult.aspx
    **************************************************************
    */

    (
    @Tables varchar(1000),
    @PrimaryKey varchar(100),
    @Sort varchar(200= NULL,
    @CurrentPage int = 1,
    @PageSize int = 10,
    @Fields varchar(1000= '*',
    @Filter varchar(1000= NULL,
    @Group varchar(1000= NULL
    )
    AS
    /*默认排序*/
    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
    /*设定排序语句.*/
    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 != ''
    SET @strGroup = ' GROUP BY ' + @Group + ' '
    ELSE
    SET @strGroup = ''
    /*执行查询语句*/
    EXEC(
    '
    DECLARE @SortColumn 
    ' + @type + '
    SET ROWCOUNT 
    ' + @strStartRow + '
    SELECT @SortColumn=
    ' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    SET ROWCOUNT 
    ' + @strPageSize + '
    SELECT 
    ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    '
    )
    GO

    注:
         1)如表名参数为多表连接时,sort列必须指定表名;
         2)只支持单字段排序,有朋友如果问为什么不做成可以多字段排序的,理论上确实有这种可能性,但需要以一定的效率损失为代价,而且会使方法过于复杂,如真有这种需要,完全可以写一个单独的分页存储过程,无论在性能还是复杂度上都比通用要简单.
         3) 对非unique字段排序的支持,但必须设定一个PK字段(注:只要是unique字段都可以作为pk字段)


      1if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Paging_RowCount]'and OBJECTPROPERTY(id, N'IsProcedure'= 1)
      2drop procedure [dbo].[Paging_RowCount]
      3GO
      4
      5SET QUOTED_IDENTIFIER ON 
      6GO
      7SET ANSI_NULLS ON 
      8GO
      9---------------------------------------------------------------
     10-- 分页存储过程(使用RowCount)  --edit by SiBen
     11-- summary:
     12--          获取表或表集合的分页数据
     13--          当多表连接时,sort列必须指定表名
     14---------------------------------------------------------------
     15
     16CREATE PROCEDURE Paging_RowCount
     17(
     18@Tables varchar(1000),
     19@PK varchar(100),
     20@Sort varchar(200= NULL,
     21@PageNumber int = 1,
     22@PageSize int = 10,
     23@Fields varchar(1000= '*',
     24@Filter varchar(1000= NULL,
     25@Group varchar(1000= NULL,
     26@RecordCount int = 0 output 
     27)
     28AS
     29
     30/*Default Sorting*/
     31IF @Sort IS NULL OR @Sort = ''
     32    SET @Sort = @PK
     33
     34/*Find the @PK type*/
     35DECLARE @SortTable varchar(100)
     36DECLARE @SortName varchar(100)
     37DECLARE @strSortColumn varchar(200)
     38DECLARE @operator char(2)
     39DECLARE @type varchar(100)
     40DECLARE @prec int
     41
     42/*Set sorting variables.*/    
     43IF CHARINDEX('DESC',@Sort)>0
     44    BEGIN
     45        SET @strSortColumn = REPLACE(@Sort'DESC''')
     46        SET @operator = '<'
     47    END
     48ELSE
     49    BEGIN
     50        IF CHARINDEX('ASC'@Sort> 0
     51            SET @strSortColumn = REPLACE(@Sort'ASC''')
     52                ELSE
     53                        SET @strSortColumn = @Sort
     54
     55        SET @operator = '>'
     56    END
     57
     58
     59IF CHARINDEX('.'@strSortColumn> 0
     60    BEGIN
     61        SET @SortTable = SUBSTRING(@strSortColumn0CHARINDEX('.',@strSortColumn))
     62        SET @SortName = SUBSTRING(@strSortColumnCHARINDEX('.',@strSortColumn+ 1LEN(@strSortColumn))
     63    END
     64ELSE
     65    BEGIN
     66        SET @SortTable = @Tables
     67        SET @SortName = @strSortColumn
     68    END
     69
     70SELECT @type=t.name, @prec=c.prec
     71FROM sysobjects o 
     72JOIN syscolumns c on o.id=c.id
     73JOIN systypes t on c.xusertype=t.xusertype
     74WHERE o.name = @SortTable AND c.name = @SortName
     75
     76IF CHARINDEX('char'@type> 0
     77   SET @type = @type + '(' + CAST(@prec AS varchar+ ')'
     78
     79DECLARE @strPageSize varchar(50)
     80DECLARE @strStartRow varchar(50)
     81DECLARE @strFilter varchar(1000)
     82DECLARE @strSimpleFilter varchar(1000)
     83DECLARE @strGroup varchar(1000)
     84
     85/*Default Page Number*/
     86IF @PageNumber < 1
     87    SET @PageNumber = 1
     88
     89/*Set paging variables.*/
     90SET @strPageSize = CAST(@PageSize AS varchar(50))
     91SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1AS varchar(50))
     92
     93/*Set filter & group variables.*/
     94IF @Filter IS NOT NULL AND @Filter != ''
     95    BEGIN
     96        SET @strFilter = ' WHERE ' + @Filter + ' '
     97        SET @strSimpleFilter = ' AND ' + @Filter + ' '
     98    END
     99ELSE
    100    BEGIN
    101        SET @strSimpleFilter = ''
    102        SET @strFilter = ''
    103    END
    104IF @Group IS NOT NULL AND @Group != ''
    105    SET @strGroup = ' GROUP BY ' + @Group + ' '
    106ELSE
    107    SET @strGroup = ''
    108
    109/*Get rows count.*/
    110DECLARE @str_Count_SQL nvarchar(500)
    111SET @str_Count_SQL= 'SELECT @TotalCount=count(*) FROM ' + @Tables + @strFilter
    112EXEC sp_executesql @str_Count_SQL,N'@TotalCount int=0 output',@RecordCount output
    113    
    114/*Execute dynamic query*/    
    115IF @Sort = @PK
    116    BEGIN
    117        EXEC(
    118        '
    119        DECLARE @SortColumn ' + @type + '
    120        SET ROWCOUNT ' + @strStartRow + '
    121        SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    122        SET ROWCOUNT ' + @strPageSize + '
    123        SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + '= @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + '
    124        '
    125        )
    126    END
    127ELSE
    128    BEGIN
    129        EXEC(
    130        '
    131        DECLARE @SortColumn ' + @type + '
    132        DECLARE @SortNullValue ' + @type + '
    133        DECLARE @PKStartValue int
    134        SET @SortNullValue=CAST('''' as '+ @type +')
    135        SET ROWCOUNT ' + @strStartRow + '
    136        SELECT @SortColumn= isNull(' + @strSortColumn + ',@SortNullValue), @PKStartValue = '+ @PK +' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ','+ @PK +' Desc 
    137        SET ROWCOUNT ' + @strPageSize + '
    138        SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE (isNull(' + @strSortColumn+',@SortNullValue)' + @operator + ' @SortColumn or (isNull(' + @strSortColumn+',@SortNullValue)=@SortColumn and '+ @PK +'<=@PKStartValue))' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ','+ @PK +' Desc
    139        '
    140        )
    141    END
    142GO
    143SET QUOTED_IDENTIFIER OFF 
    144GO
    145SET ANSI_NULLS ON 
    146GO
    147
    148
    http://www.codeproject.com/aspnet/PagingLarge.asp
    邹建的存储过程
    ALTER PROC PageView
    @tbname     sysname,           --要分页显示的表名
    @FieldKey   sysname,           --用于定位记录的主键(惟一键)字段,只能是单个字段
    @PageCurrent int=1,             --要显示的页码
    @PageSize   int=10,            --每页的大小(记录数)
    @FieldShow  nvarchar(1000)='',  --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
    @FieldOrder  nvarchar(1000)=''--以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
                                              --用于指定排序顺序
    @Where     nvarchar(1000)='',  --查询条件
    @PageCount  int OUTPUT        --总页数
    AS
    DECLARE @sql nvarchar(4000)
    SET NOCOUNT ON
    --检查对象是否有效
    IF OBJECT_ID(@tbnameIS NULL
    BEGIN
    RAISERROR(N'对象"%s"不存在',1,16,@tbname)
    RETURN
    END
    IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
    AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
    BEGIN
    RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
    RETURN
    END

    --分页字段检查
    IF ISNULL(@FieldKey,N'')=''
    BEGIN
    RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
    RETURN
    END

    --其他参数检查及规范
    IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
    IF ISNULL(@PageSize,0)<1 SET @PageSize=10
    IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
    IF ISNULL(@FieldOrder,N'')=N''
    SET @FieldOrder=N''
    ELSE
    SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
    IF ISNULL(@Where,N'')=N''
    SET @Where=N''
    ELSE
    SET @Where=N'WHERE ('+@Where+N')'

    --如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
    IF @PageCount IS NULL
    BEGIN
    SET @sql=N'SELECT @PageCount=COUNT(*)'
    +N' FROM '+@tbname
    +N' '+@Where
    EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
    SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
    END

    --计算分页显示的TOPN值
    DECLARE @TopN varchar(20),@TopN1 varchar(20)
    SELECT @TopN=@PageSize,
    @TopN1=@PageCurrent*@PageSize

    --第一页直接显示
    IF @PageCurrent=1
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder)
    ELSE
    BEGIN
    SELECT @PageCurrent=@TopN1,
    @sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN
    +N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey
    +N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname
    +N' '+@Where
    +N' '+@FieldOrder
    SET ROWCOUNT @PageCurrent
    EXEC sp_executesql @sql,
    N
    '@n int,@s nvarchar(4000) OUTPUT',
    @PageCurrent,@sql OUTPUT
    SET ROWCOUNT 0
    IF @sql=N''
    EXEC(N'SELECT TOP 0'
    +N' '+@FieldShow
    +N' FROM '+@tbname)
    ELSE
    BEGIN
    SET @sql=STUFF(@sql,1,1,N'')
    --执行查询
    EXEC(N'SELECT TOP '+@TopN
    +N' '+@FieldShow
    +N' FROM '+@tbname
    +N' WHERE '+@FieldKey
    +N' IN('+@sql
    +N''+@FieldOrder)
    END
    END
  • 相关阅读:
    Quicksum -SilverN
    uva 140 bandwidth (好题) ——yhx
    uva 129 krypton factors ——yhx
    uva 524 prime ring problem——yhx
    uva 10976 fractions again(水题)——yhx
    uva 11059 maximum product(水题)——yhx
    uva 725 division(水题)——yhx
    uva 11853 paintball(好题)——yhx
    uva 1599 ideal path(好题)——yhx
    uva 1572 self-assembly ——yhx
  • 原文地址:https://www.cnblogs.com/zhuawang/p/852129.html
Copyright © 2011-2022 走看看