【SQL】存储过程分页代码详解


代码部分过程部分:

View Code
CREATE procedure [dbo].[WS_GetKbDoc]
@KBTypeID int,
@Keyword nvarchar(50),
@pagesize int,
@pageindex int
as
begin
with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY d.CreatedDate desc)AS RowNum, d.*,s.StaffName,s.StaffNo,k.KBTypeName
from dbo.WS_Document d
left join dbo.WS_Staff s on s.UserID=d.CreatedBy
left join dbo.WS_KnowledgeBaseType k on k.KBTypeID=d.KBTypeID
where d.active=1 and IsKnowledgeBase=1
and (@KBTypeID=0 or d.KBTypeID=@KBTypeID)
and (@Keyword='' or d.DocName LIKE '%' + @Keyword + '%' or d.DocDetail LIKE '%' + @Keyword + '%' or d.DocExtension LIKE '%' + @Keyword + '%' or s.StaffName LIKE '%' + @Keyword + '%')
)

SELECT * FROM temptbl where RowNum between (@pageindex-1)*@pagesize+1 and (@pageindex-1)*@pagesize+@pagesize

select count(*) from dbo.WS_Document d
left join dbo.WS_Staff s on s.UserID=d.CreatedBy
where d.active=1 and IsKnowledgeBase=1
and (@KBTypeID=0 or d.KBTypeID=@KBTypeID)
and (@Keyword='' or d.DocName LIKE '%' + @Keyword + '%' or d.DocDetail LIKE '%' + @Keyword + '%' or d.DocExtension LIKE '%' + @Keyword + '%' or s.StaffName LIKE '%' + @Keyword + '%')
end


定义说明:

@KBTypeID int, 类型标识
@Keyword nvarchar(50),搜索关键字
@pagesize int,每一页的大小
@pageindex int,传进业的索引

SQL说明:

With:With 通常与AS连用,也叫做子查询部分

      1).   可用来定义一个SQL片断,该片断会被整个SQL语句所用到。
        2).   为了让SQL语句的可读性更高
        3).   也有可能是在UNION ALL的不同部分,作为提供数据的部分。特别对于UNION ALL比较有
           用。因为UNION ALL的每个部分可能相同,但是如果每个部分都去执行一遍的话,则成本
             太高,所以可以使用WITH AS短语,则只要执行一遍即可。

ROW_NUMBER:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。 http://msdn.microsoft.com/zh-cn/library/ms186734.aspx

详解:

with temptbl as (
SELECT ROW_NUMBER() OVER (ORDER BY d.CreatedDate desc)AS RowNum, d.*,s.StaffName,s.StaffNo,k.KBTypeName
from dbo.WS_Document d
left join dbo.WS_Staff s on s.UserID=d.CreatedBy
left join dbo.WS_KnowledgeBaseType k on k.KBTypeID=d.KBTypeID
where d.active=1 and IsKnowledgeBase=1
and (@KBTypeID=0 or d.KBTypeID=@KBTypeID)
and (@Keyword='' or d.DocName LIKE '%' + @Keyword + '%' or d.DocDetail LIKE '%' + @Keyword + '%' or d.DocExtension LIKE '%' + @Keyword + '%' or s.StaffName LIKE '%' + @Keyword + '%')
)

这段代码的主要是搜索需要的数据然后进行编号

SELECT * FROM temptbl 
where RowNum between
(@pageindex-1)*@pagesize+1
and
(@pageindex-1)*@pagesize+@pagesize

这段代码的主要是把当面检索到得数据库,通过@pageindex和@pagesize索引页来获取请求业的数据,如页大小10,第一页即为行号0到10,第二页为11到20

select count(*) from 
dbo.WS_Document d
left join dbo.WS_Staff s on s.UserID=d.CreatedBy
where d.active=1 and IsKnowledgeBase=1
and (@KBTypeID=0 or d.KBTypeID=@KBTypeID)
and (@Keyword='' or d.DocName LIKE '%' + @Keyword + '%'
or d.DocDetail LIKE '%' + @Keyword + '%'
or d.DocExtension LIKE '%' + @Keyword + '%'
or s.StaffName LIKE '%' + @Keyword + '%')

这段代码是获取总共符合条件的数据的条数.

上面存储过程用DataSet接受可以得到两张表。

在前台可以通过Table[1]来进行访问总数据


posted @ 2012-02-24 13:28  路途上的我  阅读(322)  评论(0)    收藏  举报