最近没事试着写一些简单的存储过程,由于以前很少用到或者很少自己写存储过程。所以历尽各种艰难,让自己也备受打击。
这是我写的两种排序,一种是使用 not in
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 CREATE PROC Self_CommonPage 2 @pageindex INT , 3 @pagesize INT 4 AS 5 BEGIN 6 DECLARE @pagenum INT 7 DECLARE @countsnum INT 8 DECLARE @selectnum INT 9 10 SELECT @countsnum= count(keyid) FROM Agent 11 SET @pagenum=@countsnum/@pagesize 12 IF(@pageindex<1) 13 SET @pageindex=1; 14 SET @selectnum=1*@pagesize; 15 16 IF(@pageindex>@pagenum) 17 18 SET @pageindex=@pagenum; 19 SET @selectnum=@pagesize*(@pagenum-1); 20 IF(1<=@pageindex AND @pageindex<=@pagenum) 21 SET @selectnum=@pagesize*(@pagenum-1); 22 23 SELECT TOP(@pagesize) * FROM Agent WHERE KeyId NOT IN (SELECT TOP(@selectnum) keyid FROM Agent) 24 END 25 go 26 27
另一种使用的是row_number,
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 IF object_id('Self_CommonPageByRownumber') IS NOT NULL 2 DROP PROCEDURE dbo.Self_CommonPageByRownumber 3 go 4 CREATE PROC Self_CommonPageByRownumber 5 @pageindex INT , 6 @pagesize INT, 7 @countsnum INT OUTPUT, 8 @pagecount int output 9 AS 10 set nocount on 11 BEGIN 12 DECLARE @pagenum INT 13 DECLARE @countmiddle INT 14 DECLARE @startnum INT 15 DECLARE @endnum INT 16 DECLARE @sqlstr VARCHAR(max) 17 SELECT @countsnum= count(keyid) FROM Agent 18 SET @countmiddle=@countsnum%@pagesize 19 SET @pagenum=@countsnum/@pagesize 20 IF(@countmiddle>0) 21 BEGIN 22 SET @pagenum+=1; 23 END 24 SET @pagecount=@pagenum 25 IF(@pageindex<=1) 26 BEGIN 27 SET @pageindex=1; 28 SET @startnum=0; 29 END 30 IF(@pageindex>@pagenum) 31 BEGIN 32 SET @pageindex=@pagenum; 33 IF(@pageindex*@pagesize>=@countsnum) 34 SET @startnum=@pagesize*(@pagenum-1); 35 IF(@pageindex*@pagesize<@countsnum) 36 SET @startnum=@pagesize*@pagenum 37 END 38 IF(1<@pageindex AND @pageindex<=@pagenum) 39 SET @startnum=@pagesize*(@pagenum-1)+1; 40 SET @endnum=@startnum+@pagesize; 41 SET @sqlstr='with pagelist as( SELECT row_number() OVER(ORDER BY CreateDate) as a,* FROM Agent) select * from pagelist WHERE a> '''+convert(nvarchar(128),@startnum)+''' AND a <'''+convert(nvarchar(128),@endnum)+''''; 42 43 EXEC(@sqlstr) 44 END 45 GO
说一下我在写的时候进入的一个误区我在使用row_number的时候最后需要拼sql语句刚开始在行号的比较的时候我是这样写的
“
WHERE a> '''+@startnum+''' AND a <'''@endnum+''''
”
然后在建立存储过程的时候没有报错,但在执行存储过程的时候开始出错。。我刚开始以为是我的‘号的不对,然后尝试了各种放置位置,到最后我翻了以前数据库里的存储过程,
才明白自己把这里当成了像VS一样的string字符串的拼接,但是@参数是一个int类型,两种不同的类型是拼不到一块的(不包括可以隐式转换的类型)。后来使用了convert()方法
将参数转化为varchar格式再拼接进去就好了。
还有一点就是row_number与rank 的不同,两个虽然都可以用在排序里,但是row_number 只仅仅是一行行数据的排列,不涉及相同排序的依据,每一行数据返回不同的bigint
值。而rank却是相同的排序依据回返回相同的bigint值。详情请参阅http://bear-study-hard.cnblogs.com/archive/2006/02/09/327723.html