首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

公司业务系统的分页存储过程,该怎么解决

2012-09-10 
公司业务系统的分页存储过程老大让我研究一下分页存储过程,可惜小弟不才,只能求助各位大侠了,我在百度查了

公司业务系统的分页存储过程
老大让我研究一下分页存储过程,可惜小弟不才,只能求助各位大侠了,我在百度查了一下,这个存储过程网上也有,网上那个没有解释看不明白,这个也是,而且复杂一点 ,希望余下 --? --文字 的部分可以给出每句的解释或者那句话的作用、用途,因为本人实在太菜了

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)
看这个你能用上不。。
[解决办法]
我也正要用这个,学习~~~

热点排行
Bad Request.