公司业务系统的分页存储过程
老大让我研究一下分页存储过程,可惜小弟不才,只能求助各位大侠了,我在百度查了一下,这个存储过程网上也有,网上那个没有解释看不明白,这个也是,而且复杂一点 ,希望余下 --? --文字 的部分可以给出每句的解释或者那句话的作用、用途,因为本人实在太菜了
- SQL code
USE [XXDB]GOSET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO------------------------ 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)ASBEGIN 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)
[解决办法]
他是先按照条件搜索到表中的主键,然后放到临时表里面,
然后根据自增列去行数,
这个时候在和主表做联接查询
[解决办法]
sql分页供参考:
pageSize --每页显示数据条数
currentIndex --当前页数
id --自增id
select top pageSize * from dbo.table02 where id not in(select top ((pageSize -1)*pageSize ) id from table02)
[解决办法]
CREATE PROCEDURE [dbo].[PROCE_Paging]
(
@TableName varchar(50), --表名
@ReFieldsStr varchar(200) = '*', --字段名(全部字段为*)
@OrderString varchar(200), --排序字段(必须!支持多字段不用加order by)
@WhereString varchar(500) =N'', --条件语句(不用加where)
@PageSize int, --每页多少条记录
@PageIndex int = 1 , --指定当前为第几页
@TotalRecord int output --返回总记录数
)
AS
BEGIN
--处理开始点和结束点
Declare @StartRecord int;
Declare @EndRecord int;
Declare @TotalCountSql nvarchar(500);
Declare @SqlString nvarchar(2000);
set @StartRecord = (@PageIndex-1)*@PageSize + 1
set @EndRecord = @StartRecord + @PageSize - 1
SET @TotalCountSql= N'select @TotalRecord = count(*) from ' + @TableName;--总记录数语句
SET @SqlString = N'(select row_number() over (order by '+ @OrderString +') as rowId,'+@ReFieldsStr+' from '+ @TableName;--查询语句
--
IF (@WhereString! = '' or @WhereString!=null)
BEGIN
SET @TotalCountSql=@TotalCountSql + ' where '+ @WhereString;
SET @SqlString =@SqlString+ ' where '+ @WhereString;
END
--第一次执行得到
--IF(@TotalRecord is null)
-- BEGIN
EXEC sp_executesql @totalCountSql,N'@TotalRecord int out',@TotalRecord output;--返回总记录数
-- END
----执行主语句
set @SqlString ='select * from ' + @SqlString + ') as t where rowId between ' + ltrim(str(@StartRecord)) + ' and ' + ltrim(str(@EndRecord));
Exec(@SqlString)
看这个你能用上不。。
[解决办法]
我也正要用这个,学习~~~