存储过程分页实现代码,2005 T-SQL新增功能

时间:2022-09-11 04:05:27

      今天看了看2005中T-SQL的新增功能,心血来潮,试了试利用CTE方法做的分页,感觉还不错。下面贴一下TopN方法和CTE方法的数据分页的存储过程,写的还算是比较通用。性能分析我以后会进一步研究一下。
      代码还是先来一个测试用表,代码如下:

 1 存储过程分页实现代码,2005 T-SQL新增功能SET  ANSI_NULLS  ON
 2 存储过程分页实现代码,2005 T-SQL新增功能 GO
 3 存储过程分页实现代码,2005 T-SQL新增功能 SET  QUOTED_IDENTIFIER  ON
 4 存储过程分页实现代码,2005 T-SQL新增功能 GO
 5 存储过程分页实现代码,2005 T-SQL新增功能 CREATE   TABLE   [ dbo ] . [ testTable ] (
 6 存储过程分页实现代码,2005 T-SQL新增功能     [ id ]   [ int ]   IDENTITY ( 1 , 1 NOT   NULL ,
 7 存储过程分页实现代码,2005 T-SQL新增功能     [ testDate ]   [ datetime ]   NOT   NULL   CONSTRAINT   [ DF_testTable_testDate ]    DEFAULT  ( getdate ()),
 8 存储过程分页实现代码,2005 T-SQL新增功能     [ name ]   [ nvarchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL ,
 9 存储过程分页实现代码,2005 T-SQL新增功能     [ description ]   [ nchar ] ( 50 ) COLLATE Chinese_PRC_CI_AS  NOT   NULL ,
10 存储过程分页实现代码,2005 T-SQL新增功能     [ orderColum ]   [ float ]   NOT   NULL ,
11 存储过程分页实现代码,2005 T-SQL新增功能  CONSTRAINT   [ PK_testTable ]   PRIMARY   KEY   CLUSTERED  
12 存储过程分页实现代码,2005 T-SQL新增功能(
13 存储过程分页实现代码,2005 T-SQL新增功能     [ id ]   ASC
14 存储过程分页实现代码,2005 T-SQL新增功能) WITH  (IGNORE_DUP_KEY  =   OFF ON   [ PRIMARY ]
15 存储过程分页实现代码,2005 T-SQL新增功能 ON   [ PRIMARY ]
16 存储过程分页实现代码,2005 T-SQL新增功能

        填充一下表,加了3W条记录,倒是不多。

1 存储过程分页实现代码,2005 T-SQL新增功能declare   @i   int
2 存储过程分页实现代码,2005 T-SQL新增功能         set   @i   =   1
3 存储过程分页实现代码,2005 T-SQL新增功能         while   @i   <   30001
4 存储过程分页实现代码,2005 T-SQL新增功能         begin
5 存储过程分页实现代码,2005 T-SQL新增功能             INSERT   INTO  testTable( [ name ] , [ description ] , [ orderColum ] )
6 存储过程分页实现代码,2005 T-SQL新增功能                  VALUES ( ' names ' ' descriiption ' @i   *   rand ())
7 存储过程分页实现代码,2005 T-SQL新增功能             set   @i   =   @i   + 1
8 存储过程分页实现代码,2005 T-SQL新增功能         end

      1、TopN方法:这个方法就不多说了,相当普遍,页码少的时候比较好使。
         [代码]    

 1 存储过程分页实现代码,2005 T-SQL新增功能=============================================
 2 存储过程分页实现代码,2005 T-SQL新增功能 --  Author:        <Author,,microant>
 3 存储过程分页实现代码,2005 T-SQL新增功能--  Create date: <2007年7月5日,,>
 4 存储过程分页实现代码,2005 T-SQL新增功能--  Description:    <Description,selectTopN分页方法,>
 5 存储过程分页实现代码,2005 T-SQL新增功能--  =============================================
 6 存储过程分页实现代码,2005 T-SQL新增功能 CREATE   PROCEDURE   [ dbo ] . [ sp_SelectTopN ] (
 7 存储过程分页实现代码,2005 T-SQL新增功能     --  Add the parameters for the stored procedure here
 8 存储过程分页实现代码,2005 T-SQL新增功能      @TableName   varchar ( 200 =   ' testTable ' ,     -- 表名
 9 存储过程分页实现代码,2005 T-SQL新增功能      @PageSize   int   =   15 ,         -- 页面大小
10 存储过程分页实现代码,2005 T-SQL新增功能      @PageIndex   int   = 2     ,     -- 页面的序号
11 存储过程分页实现代码,2005 T-SQL新增功能      -- @IsCountNull bit =1,    --返回记录是否为空
12 存储过程分页实现代码,2005 T-SQL新增功能      @IsAsc   bit   =   1     ,     -- 是否卫升序,升序为1,降序为0
13 存储过程分页实现代码,2005 T-SQL新增功能      @OderColumName   varchar ( 200 =   null ,         -- 排序字段名
14 存储过程分页实现代码,2005 T-SQL新增功能      @KeyID   varchar ( 50 =   ' id ' ,         -- 主键
15 存储过程分页实现代码,2005 T-SQL新增功能      @Conditions   varchar ( 500 =   null   -- 查询条件
16 存储过程分页实现代码,2005 T-SQL新增功能 )
17 存储过程分页实现代码,2005 T-SQL新增功能 AS
18 存储过程分页实现代码,2005 T-SQL新增功能     set  nocount  on
19 存储过程分页实现代码,2005 T-SQL新增功能    
20 存储过程分页实现代码,2005 T-SQL新增功能     declare   @strSql   nvarchar ( 1000 )
21 存储过程分页实现代码,2005 T-SQL新增功能     declare   @tempstr   nvarchar ( 1000 )
22 存储过程分页实现代码,2005 T-SQL新增功能     declare   @orderstr   nvarchar ( 400 )
23 存储过程分页实现代码,2005 T-SQL新增功能    
24 存储过程分页实现代码,2005 T-SQL新增功能 -- 判断排序方式,@IsAsc =1 升序, 0降序,设置排序语句
25 存储过程分页实现代码,2005 T-SQL新增功能      if   @IsAsc   =   1
26 存储过程分页实现代码,2005 T-SQL新增功能     begin
27 存储过程分页实现代码,2005 T-SQL新增功能         if ( @OderColumName   is   null   or   @OderColumName   =   '' )
28 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @KeyID   +   '  asc '
29 存储过程分页实现代码,2005 T-SQL新增功能         else
30 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @OderColumName   +   '  asc '
31 存储过程分页实现代码,2005 T-SQL新增功能     end
32 存储过程分页实现代码,2005 T-SQL新增功能     else
33 存储过程分页实现代码,2005 T-SQL新增功能     begin
34 存储过程分页实现代码,2005 T-SQL新增功能         if ( @OderColumName   is   null   or   @OderColumName   =   '' )
35 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @KeyID   +   '  desc '
36 存储过程分页实现代码,2005 T-SQL新增功能         else
37 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @OderColumName   +   '  desc '
38 存储过程分页实现代码,2005 T-SQL新增功能     end
39 存储过程分页实现代码,2005 T-SQL新增功能
40 存储过程分页实现代码,2005 T-SQL新增功能 -- 查询条件是否添加
41 存储过程分页实现代码,2005 T-SQL新增功能      if   @Conditions   is   null
42 存储过程分页实现代码,2005 T-SQL新增功能     begin
43 存储过程分页实现代码,2005 T-SQL新增功能         set   @tempstr   =   ' select top  '   +    str ( @PageSize * @PageIndex )   + '   '   + @KeyID   + '  from  '   +   @TableName   +   @orderstr ;
44 存储过程分页实现代码,2005 T-SQL新增功能         set   @strSql   =   ' select top  '   +    str ( @PageSize ) +   '   * from  '   +   @TableName   +   '  where  '   +   @KeyID   + '  not in (  '   +   @tempstr   + ' ) '   +    @orderstr
45 存储过程分页实现代码,2005 T-SQL新增功能     end
46 存储过程分页实现代码,2005 T-SQL新增功能     else
47 存储过程分页实现代码,2005 T-SQL新增功能         begin
48 存储过程分页实现代码,2005 T-SQL新增功能             set   @tempstr   =   ' select top  '   +    str ( @PageSize * @PageIndex )   + '   '   + @KeyID   + '  from  '   +   @TableName +   '  where  '   +   @Conditions   +   '   '    +   @orderstr ;
49 存储过程分页实现代码,2005 T-SQL新增功能             set   @strSql   =   ' select top  '   +    str ( @PageSize ) +   '   * from  '   +    @TableName   +   '  where  '   +   @Conditions   +   '  and  '    +   @KeyID   + '  not in ( '   +   @tempstr   + ' ) '   +    @orderstr
50 存储过程分页实现代码,2005 T-SQL新增功能         end
51 存储过程分页实现代码,2005 T-SQL新增功能     print   @strSql
52 存储过程分页实现代码,2005 T-SQL新增功能     exec  sp_executesql  @strSql
53 存储过程分页实现代码,2005 T-SQL新增功能 set  nocount  off
54 存储过程分页实现代码,2005 T-SQL新增功能

         [测试]

 1 存储过程分页实现代码,2005 T-SQL新增功能DECLARE      @return_value   int
 2 存储过程分页实现代码,2005 T-SQL新增功能 EXEC      @return_value   =   [ dbo ] . [ sp_SelectTopN ]
 3 存储过程分页实现代码,2005 T-SQL新增功能         @TableName   =  N ' testTable ' ,
 4 存储过程分页实现代码,2005 T-SQL新增功能         @PageSize   =   30 ,
 5 存储过程分页实现代码,2005 T-SQL新增功能         @PageIndex   =   4 ,
 6 存储过程分页实现代码,2005 T-SQL新增功能         @IsAsc   =   0 ,
 7 存储过程分页实现代码,2005 T-SQL新增功能         @OderColumName   =  N ' orderColum ' ,
 8 存储过程分页实现代码,2005 T-SQL新增功能         @KeyID   =  N ' id ' ,
 9 存储过程分页实现代码,2005 T-SQL新增功能         @Conditions   =   ' id > 50 '
10 存储过程分页实现代码,2005 T-SQL新增功能 SELECT      ' Return Value '   =   @return_value
11 存储过程分页实现代码,2005 T-SQL新增功能 go
12 存储过程分页实现代码,2005 T-SQL新增功能

      2、CTE方法:
            CTE(常见表表达式)是一个可以由定义语句引用的临时命名的结果集,和临时表比较相似。一般形式如下,
            WITH <cte_alias>(<column_aliases>)
            AS
            (
              <cte_query>
            )
            SELECT *
            FROM <cte_alias>
            但是比临时表慢,但是考虑临时表会增大日志文件的大小,引起大量IO,CTE也就有他自己的优势。性能分析详情参见http://blog.csdn.net/yizhu2000/archive/2007/06/03/1636573.aspx
   
      [代码]

 1 存储过程分页实现代码,2005 T-SQL新增功能--  =============================================
 2 存储过程分页实现代码,2005 T-SQL新增功能--  Author:        <Author,,microant>
 3 存储过程分页实现代码,2005 T-SQL新增功能--  Create date: <Create Date,,20070705>
 4 存储过程分页实现代码,2005 T-SQL新增功能--  Description:    <Description,,CTE分页>
 5 存储过程分页实现代码,2005 T-SQL新增功能--  =============================================
 6 存储过程分页实现代码,2005 T-SQL新增功能 CREATE   PROCEDURE   [ dbo ] . [ sp_CTE ]
 7 存储过程分页实现代码,2005 T-SQL新增功能     --  Add the parameters for the stored procedure here
 8 存储过程分页实现代码,2005 T-SQL新增功能      @TableName   varchar ( 200 =   ' testTable ' ,     -- 表名
 9 存储过程分页实现代码,2005 T-SQL新增功能      @PageSize   int   =   15 ,         -- 页面大小
10 存储过程分页实现代码,2005 T-SQL新增功能      @PageIndex   int   = 2     ,     -- 页面的序号
11 存储过程分页实现代码,2005 T-SQL新增功能      -- @IsCountNull bit =1,    --返回记录是否为空
12 存储过程分页实现代码,2005 T-SQL新增功能      @IsAsc   bit   =   1     ,     -- 是否卫升序,升序为1,降序为0
13 存储过程分页实现代码,2005 T-SQL新增功能      @OderColumName   varchar ( 200 =   null ,         -- 排序字段名
14 存储过程分页实现代码,2005 T-SQL新增功能      @KeyID   varchar ( 50 =   ' id ' ,         -- 主键
15 存储过程分页实现代码,2005 T-SQL新增功能      @Conditions   varchar ( 500 =   null   -- 查询条件
16 存储过程分页实现代码,2005 T-SQL新增功能 )
17 存储过程分页实现代码,2005 T-SQL新增功能 AS
18 存储过程分页实现代码,2005 T-SQL新增功能
19 存储过程分页实现代码,2005 T-SQL新增功能     --  SET NOCOUNT ON added to prevent extra result sets from
20 存储过程分页实现代码,2005 T-SQL新增功能      --  interfering with SELECT statements.
21 存储过程分页实现代码,2005 T-SQL新增功能      SET  NOCOUNT  ON ;
22 存储过程分页实现代码,2005 T-SQL新增功能
23 存储过程分页实现代码,2005 T-SQL新增功能     declare   @strSql   nvarchar ( 1000 )
24 存储过程分页实现代码,2005 T-SQL新增功能     declare   @tempstr   nvarchar ( 1000 )
25 存储过程分页实现代码,2005 T-SQL新增功能     declare   @orderstr   nvarchar ( 400 )
26 存储过程分页实现代码,2005 T-SQL新增功能     declare   @ctestr   nvarchar ( 400 )
27 存储过程分页实现代码,2005 T-SQL新增功能    
28 存储过程分页实现代码,2005 T-SQL新增功能     -- 判断排序方式,@IsAsc =1 升序, 0降序,设置排序语句
29 存储过程分页实现代码,2005 T-SQL新增功能      if   @IsAsc   =   1
30 存储过程分页实现代码,2005 T-SQL新增功能     begin
31 存储过程分页实现代码,2005 T-SQL新增功能         if ( @OderColumName   is   null   or   @OderColumName   =   '' )
32 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @KeyID   +   '  asc '
33 存储过程分页实现代码,2005 T-SQL新增功能         else
34 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @OderColumName   +   '  asc '
35 存储过程分页实现代码,2005 T-SQL新增功能     end
36 存储过程分页实现代码,2005 T-SQL新增功能     else
37 存储过程分页实现代码,2005 T-SQL新增功能     begin
38 存储过程分页实现代码,2005 T-SQL新增功能         if ( @OderColumName   is   null   or   @OderColumName   =   '' )
39 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @KeyID   +   '  desc '
40 存储过程分页实现代码,2005 T-SQL新增功能         else
41 存储过程分页实现代码,2005 T-SQL新增功能             set   @orderstr   =   '  order by  '   +   @OderColumName   +   '  desc '
42 存储过程分页实现代码,2005 T-SQL新增功能     end
43 存储过程分页实现代码,2005 T-SQL新增功能    
44 存储过程分页实现代码,2005 T-SQL新增功能     -- CTE
45 存储过程分页实现代码,2005 T-SQL新增功能      set   @ctestr   = ' with Table_CET
46 存储过程分页实现代码,2005 T-SQL新增功能    as
47 存储过程分页实现代码,2005 T-SQL新增功能    (
48 存储过程分页实现代码,2005 T-SQL新增功能        select 
49 存储过程分页实现代码,2005 T-SQL新增功能            CEILING((ROW_NUMBER() OVER ( '   +   @orderstr   +   ' ))/ '   +   str ( @PageSize +   ' ) as page_num, * 
50 存储过程分页实现代码,2005 T-SQL新增功能        from  '   +   @TableName   +
51 存储过程分页实现代码,2005 T-SQL新增功能     ' ) '  ;
52 存储过程分页实现代码,2005 T-SQL新增功能    
53 存储过程分页实现代码,2005 T-SQL新增功能    
54 存储过程分页实现代码,2005 T-SQL新增功能     set   @strSql   =   @ctestr   +   ' select * from Table_CET where page_num =  '   +   str ( @PageIndex ) +   '  and  '   +   @Conditions ;
55 存储过程分页实现代码,2005 T-SQL新增功能    
56 存储过程分页实现代码,2005 T-SQL新增功能     print   @strSql
57 存储过程分页实现代码,2005 T-SQL新增功能     begin
58 存储过程分页实现代码,2005 T-SQL新增功能     exec  sp_executesql  @strSql ;
59 存储过程分页实现代码,2005 T-SQL新增功能     end

   [测试]

 1 存储过程分页实现代码,2005 T-SQL新增功能DECLARE      @return_value   int
 2 存储过程分页实现代码,2005 T-SQL新增功能 EXEC      @return_value   =   [ dbo ] . [ sp_CTE ]
 3 存储过程分页实现代码,2005 T-SQL新增功能         @TableName   =  N ' testTable ' ,
 4 存储过程分页实现代码,2005 T-SQL新增功能         @PageSize   =   30 ,
 5 存储过程分页实现代码,2005 T-SQL新增功能         @PageIndex   =   4 ,
 6 存储过程分页实现代码,2005 T-SQL新增功能         @IsAsc   =   0 ,
 7 存储过程分页实现代码,2005 T-SQL新增功能         @OderColumName   =  N ' orderColum ' ,
 8 存储过程分页实现代码,2005 T-SQL新增功能         @KeyID   =  N ' id ' ,
 9 存储过程分页实现代码,2005 T-SQL新增功能         @Conditions   =   ' id > 50 '
10 存储过程分页实现代码,2005 T-SQL新增功能 SELECT      ' Return Value '   =   @return_value
11 存储过程分页实现代码,2005 T-SQL新增功能 GO

      3、以前没太关注SQL server 2005的新功能,一直在用MySQL,或者2000,每天关注Oracle但是很不幸都没机会做过什么。不曾想加了不少共能,得好好看看。师兄再给我说他们在用Informax等一系列工具做数据仓库,很高兴听到几个不懂得名词,很不幸没有机会见识见识。还是务实点看看2005提供了啥吧。
            T-SQL也出现了不少新功,CTE就不错看着,比较好使,具体参见https://www.microsoft.com/china/msdn/library/data/sqlserver/05TSQLEnhance.mspx?mfr=true