none
公司业务系统的分页存储过程 RRS feed

  • 问题

  • 老大让我研究一下分页存储过程,可惜小弟不才,只能求助各位大侠了,我在百度查了一下,这个存储过程网上也有,网上那个没有解释看不明白,这个也是,而且复杂一点

    USE [XXDB]
    GO
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO

    ----------------------------------------------------------------- -- Name: CT_Append Store Procedure -- Author: xx -- DateTime:xx -- Description: Data TableCT_Append , Get List ----------------------------------------------------------------- /* @PageIndex @TotalRecords */ ALTER PROCEDURE [dbo].[CT_Append_Search] ( @VC_A_SNNO varchar(50), @VC_OC_UserName varchar(50), @VC_OC_Company varchar(50), @VC_A_CardNO varchar(50), @CardType int, @VC_A_AppendType varchar(50), @VC_TicketType varchar(50), @VC_TicketNO varchar(50), @StartDate varchar(50), @EndDate varchar(50), @PageIndex int, @TotalRecords int ) AS BEGIN DECLARE @Page int DECLARE @PageLowerBound int DECLARE @PageUpperBound int DECLARE @RowsToReturn int SET @Page = (@PageIndex - 1) -- First set the rowcount SET @RowsToReturn = @TotalRecords * (@Page + 1) --这句话有什么用 SET ROWCOUNT @RowsToReturn --这里是不是语法错误,还是赋值语句? -- Set the page bounds SET @PageLowerBound = @TotalRecords * @Page SET @PageUpperBound = @PageLowerBound + @TotalRecords + 1 -- Create a temp table to store the select results CREATE TABLE #PageIndex ( IndexId int IDENTITY (1, 1) NOT NULL, VC_A_SNNO varchar(50) ) Declare @ConSQL varchar(2000) Declare @StrSQL varchar(2000) set @StrSQL='INSERT INTO #PageIndex (VC_A_SNNO) SELECT [VC_A_SNNO] FROM [CT_Append] a LEFT OUTER JOIN CT_OuterCard b ON a.VC_A_CardNO = b.VC_OC_CardNO LEFT OUTER JOIN CT_InhouseCard c ON a.VC_A_CardNO = c.VC_IC_CardNO where a.RecordNO<>0' set @ConSQL='' if(@VC_A_SNNO<>'') begin set @ConSQL=@ConSQL + ' and a.VC_A_SNNO like ''%' + @VC_A_SNNO +'%''' end if(@VC_OC_UserName<>'') begin set @ConSQL=@ConSQL + ' and b.VC_OC_UserName like ''%' + @VC_OC_UserName+'%''' end if(@VC_OC_Company<>'') begin set @ConSQL=@ConSQL + ' and b.VC_OC_Company like ''%' + @VC_OC_Company+'%''' end if(@VC_A_CardNO<>'') begin set @ConSQL=@ConSQL + ' and a.VC_A_CardNO like ''%' + @VC_A_CardNO+'%''' end if(@CardType>0) begin set @ConSQL=@ConSQL + ' and a.I_A_CardType=' + cast(@CardType as varchar(2)) end if(@VC_A_AppendType<>'') begin set @ConSQL=@ConSQL + ' and a.VC_A_AppendType=''' + @VC_A_AppendType+'''' end if(@VC_TicketType<>'') begin set @ConSQL=@ConSQL + ' and a.VC_TicketType=''' + @VC_TicketType+'''' end if(@VC_TicketNO<>'') begin set @ConSQL=@ConSQL + ' and a.VC_TicketNO=''' + @VC_TicketNO+'''' end if(@StartDate<>'') begin set @ConSQL=@ConSQL + ' and a.D_A_AppendDateTime>=''' + @StartDate+'''' end if(@EndDate<>'') begin set @ConSQL=@ConSQL + ' and a.D_A_AppendDateTime<=''' + @EndDate+'''' end Execute(@StrSQL + @ConSQL +' order by a.D_A_AppendDateTime DESC') SELECT c.VC_A_SNNO, [VC_A_AppendType] , [VC_A_CardNO] , [I_A_CardType] , [I_A_PointToOil] , [VC_TicketType] , [VC_TicketNO] , [DE_A_BAmount] , [DE_A_AppendAmount] , [DE_A_AAmount] , [D_A_AppendDateTime] , [VC_A_Remark] , [VC_A_OperatorNO] FROM [CT_Append] c , #PageIndex PageIndex --不明白临时表在这里有什么用? WHERE c.VC_A_SNNO = PageIndex.VC_A_SNNO AND PageIndex.IndexID > @PageLowerBound AND PageIndex.IndexID < @PageUpperBound Execute('SELECT COUNT(VC_A_SNNO) AS TotalRecords FROM [CT_Append] a LEFT OUTER JOIN --为什麽要连接其他的表 CT_OuterCard b ON a.VC_A_CardNO = b.VC_OC_CardNO LEFT OUTER JOIN CT_InhouseCard c ON a.VC_A_CardNO = c.VC_IC_CardNO where a.RecordNO<>0' + @ConSQL) END



    给我写信: QQ我:点击这里给我发消息




    2012年5月9日 16:43

答案

  • 就我所知from table1,table2这种写法比较接近cross join,会列出table1和table2的交叉乘积,与inner join的效果不同,inner join是要有对应上才会列出。

    我以下列的程序代码简单举例上述的说法。

    declare @t1 table
    (c1 int,c2 int)
    
    declare @t2 table
    (c3 int, c1 int)
    
    insert into @t1 values (1,1),(2,2),(3,3)
    insert into @t2 values (2,1),(2,3)
    
    select *
    from @t1 a
    inner join @t2 b on a.c1 = b.c1
    
    select *
    from @t1
    cross join @t2
    
    select *
    from @t1,@t2
    http://msdn.microsoft.com/zh-tw/library/ms177634(v=sql.105).aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    2012年5月10日 1:58

全部回复

  • 1. SET ROWCOUNT 是用来限制SQL Server处理结果集的数量用的,例如ROWCOUNT设定为2,则SQL Server就会只处理2笔数据就停止了,因此只会回传2笔数据。,看起来你的Stored Procedure是利用这种方式来做分页。

    2. FROM [CT_Append] c , #PageIndex PageIndex --不明白临时表在这里有什么用?

    这是因为需要取得IndexID,所以需要跟#PageIndex做Join。

    3.Execute('SELECT COUNT(VC_A_SNNO) AS TotalRecords FROM [CT_Append] a LEFT OUTER JOIN --为什麽要连接其他的表

    我以为这是要计算VC_A_SNNO数量所会用到的相关表格,详细情况可能要看你的需求而定。

    http://msdn.microsoft.com/en-us/library/ms188774.aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/

    2012年5月9日 23:06
  • SET ROWCOUNT @RowsToReturn                        --这里是不是语法错误,还是赋值语句?

    像这种纯粹是语句的功能,建议楼主学会查SQl Server 自带的联机帮助上语句的语法和功能

    http://technet.microsoft.com/zh-cn/library/ms188774.aspx

    2012年5月9日 23:41
  • 2. FROM[CT_Append] c ,#PageIndex PageIndex --不明白临时表在这里有什么用?

    但是语法不是这样吗?

    [CT_Append] c inner join #PageIndex PageIndex
    on c.VC_A_SNNO = PageIndex.VC_A_SNNO

    给我写信: QQ我:点击这里给我发消息

    2012年5月10日 1:23
  • 就我所知from table1,table2这种写法比较接近cross join,会列出table1和table2的交叉乘积,与inner join的效果不同,inner join是要有对应上才会列出。

    我以下列的程序代码简单举例上述的说法。

    declare @t1 table
    (c1 int,c2 int)
    
    declare @t2 table
    (c3 int, c1 int)
    
    insert into @t1 values (1,1),(2,2),(3,3)
    insert into @t2 values (2,1),(2,3)
    
    select *
    from @t1 a
    inner join @t2 b on a.c1 = b.c1
    
    select *
    from @t1
    cross join @t2
    
    select *
    from @t1,@t2
    http://msdn.microsoft.com/zh-tw/library/ms177634(v=sql.105).aspx


    以上說明若有錯誤請指教,謝謝。
    http://www.dotblogs.com.tw/terrychuang/


    2012年5月10日 1:58
  • 好的,谢谢


    给我写信: QQ我:点击这里给我发消息

    2012年5月10日 13:37