1、发表缘由:
做一个类似于博客的文章系统,其中里面有一个文章模块,在后者是用标签来添加分类的新闻的,比如:操作指引(classId=1),活动动态(classId=2),博主文章(classId=3)等等,其中博主文章是博主发布的,操作指引,活动动态等,是在系统管理后台发布的,并且都有一个置顶和前台推荐的的功能,就是在数据库中有个字段标识是否推荐,现在首页要求取某个分类的前n条,其中m(n>m)条是按是否推荐字段(TopNum),剩下的简单的将数据表设计一下,表结构如下:
id为表的索引,o,tiele应该是title,写错了,是标题,内容,分类,推荐值,用户编号,增加时间,在首页的话可以将提取出来的信息显示出来,作为一个引导作用,将用户引导到子页面。又有一个页面对应的分类有20条数据,也是按照这种要求进行提取,所以就需要一个统一的方法对这个表的数据进行提取。
2、思路:
有了需求,就得想个办法,由于之前写过一个分页的存储过程,想能不能将这个需求结合分页的存储过程加以整合呢,所以就将上表所需的东西按需求房子一张临时表中,将这个临时表作为分页存储过程的主表,做到完美结合,结合需求,将参数整出来,参数如下:
@classId nvarchar(10),--文章分类(eg:1,2,3,4..)
@topNum int,--选取topNum=?的置顶条数
@isTopNum nvarchar(100),--TopNum是置顶的值,TopNum=1(前台推荐),TopNum=2(置顶).....
@selectTopNum nvarchar(100),--总共获取多少条数
@TotalPage int output,--总页数
@RowsCount int output,--总条数
@PageSize int,--每页显示数据
@CurrentPage int--当前分页
因为这个存储过程是结合特定的表而写的,所以没有对所需数据字段做什么参数,需要什么数据直接在存储过程里面直接定义就行了,如果selectTopNum的值为0的话,后面的分页参数就起作用了,不然分页就不起作用,就直接提前前面几条数据,这样就做到了通用,呵呵!
3、代码:
最后将代码发布一下,供园子里的朋友们参考,当然,我个人更希望得到园友们的指点,以便提高,代码如下:
2 CREATE PROCEDURE selectTopN
3
4 @classId nvarchar(10),--文章分类(eg:1,2,3,4..)
5 @topNum int,--选取istop=?的置顶条数
6 @isTopNum nvarchar(100),--isTop是置顶的值,isTop=1(前台推荐),isTop=2(置顶).....
7 @selectTopNum nvarchar(100),--总共获取多少条数
8
9 @TotalPage int output,
10 @RowsCount int output,
11 @PageSize int,
12 @CurrentPage int
13 As
14
15 Begin
16 --print @PageSize
17 declare @RecordCount float
18 declare @PageNum int --分页依据数
19 Declare @TemSql nvarchar(1000)
20 Declare @nRd int
21 declare @afterRows int
22 declare @tempTableName nvarchar(10)
23
24 declare @sql nvarchar(200)
25 declare @topClassNum nvarchar(100)
26 declare @selectNum nvarchar(100)
27 declare @stringStr nvarchar(100)
28
29 set @selectNum=cast( @selectTopNum as int)
30 --print @classId
31 set @stringStr=' classId='+@classId
32 set @isTopNum=' isTop='+@isTopNum
33 set @topClassNum=' top '+cast( @topNum as varchar(20))
34 set @selectTopNum=' top '+ cast( @selectTopNum as varchar(20))
35
36 --create temp table begin
37 set @sql=' create table t# (tid int identity(1,1) ,id int ,title nvarchar(100),userId int,classId int,isTop int )'
38 --print @sql
39 exec sp_executeSql @sql
40 set @sql=' insert into t# (id,title,userid,classid,istop) select ' +@topClassNum+' [id],title,userId,classId,isTop from article where '+ @stringStr+' and isTop =1 order by addTime desc '
41 --print @sql
42 exec sp_executeSql @sql
43
44 declare @rCount int select @rCount=count(1) from t#
45 --set @rCount=20-@rCount
46 --print @rCount
47 if(@rCount<@topNum)
48 begin delete from t#
49 set @sql=' insert into t#(id,title,userid,classid,istop) select [id],title,userId,classId,isTop from article where ' + @stringStr+' and istop<'+cast(@topNum as varchar(20))+' order by istop desc, addTime desc'
50 --print @sql
51 exec sp_executeSql @sql
52 end
53 else begin
54 set @sql='insert into t#(id,title,userid,classid,istop) select a.id,a.title,a.userId,a.classId,a.isTop from article a where a.id not in(select [id] from t#) and '+@stringStr+' and isTop<'+cast( @topNum as varchar(20))+' order by addTime desc'
55 --print @sql
56 exec sp_executeSql @sql
57 End
58 --create temp tble end
59
60
61 if(@selectNum<>0) --@selectNum=0,则表示分页,不然就取selectTopNum条数据
62 begin
63 set @sql=' select '+@selectTopNum+' * from t# order by tid asc'
64 --print @sql
65 exec sp_executeSql @sql
66 end
67 else begin
68 --print 'begin'
69 Set @TemSql='Select @RecordCount=Count(1) from t#'
70 exec sp_executesql @TemSql,N'@RecordCount float output',@RecordCount output
71
72 Set @RowsCount=@RecordCount
73 Set @TotalPage= ceiling(@RecordCount/@PageSize)
74
75 if(@CurrentPage>@TotalPage)
76 Set @CurrentPage=@TotalPage
77 if(@CurrentPage<1)
78 Set @CurrentPage=1
79 if(@PageSize<1)
80 Set @PageSize=1
81 --print(@RecordCount)
82 if(@CurrentPage=1)
83 Begin
84 set Rowcount @PageSize
85 print @PageSize
86 set @Sql='select top '+ cast( @PageSize as varchar(20)) +'* from t# order by tid asc'
87 --print(@Sql)
88 exec sp_executeSql @Sql
89 End
90 else if(@CurrentPage=@TotalPage)
91 begin
92 set @afterRows=@RowsCount-(@CurrentPage-1)*@PageSize
93 set RowCount @afterRows
94 set @Sql=' select top '+cast( @afterRows as nvarchar(20))+' * from t# order by tid desc'
95 -- print(@Sql)
96 exec sp_executeSql @Sql
97 end
98 else
99 Begin
100 set @nRd=@PageSize* (@CurrentPage-1)
101 print(@nRd)
102 set RowCount @PageSize
103 set @Sql='select * from t# where tid not in (select top '+ cast(@nRd as nvarchar(10))+' tid from t# order by tid asc) ' + ' order by tid desc'
104 exec sp_executeSql @Sql
105 --Print(@sql)
106
107 End
108
109 end
110 drop table t#
111 end
112 GO
113
114
4、总结:
很少这么认真的写点东西,呵呵,本人太懒了,其实不是懒,是因为很多时候自己需要学习的东西太多了,这是在项目中遇到的一个问题,其中在写存储过程中也发现一些存储过程需要注意的地方,就是当你定义了一个字符串变量时,做字符串的链接时,不能直接和整型变量相接,而要转换后再链接。
PS:文章出处http://www.cnblogs.com/jxcia_Lai,欢迎转载