在數據庫裏進行分頁處理

最近沒事試着寫一些簡單的存儲過程,因爲之前不多用到或者不多本身寫存儲過程。因此歷盡各類艱難,讓本身也備受打擊。html

這是我寫的兩種排序,一種是使用 not in sql

 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   
NOT IN

另外一種使用的是row_number,數據庫

 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

說一下我在寫的時候進入的一個誤區我在使用row_number的時候最後須要拼sql語句剛開始在行號的比較的時候我是這樣寫的ide

spa

WHERE a> '''+@startnum+''' AND a <'''@endnum+''''code

htm

而後在創建存儲過程的時候沒有報錯,但在執行存儲過程的時候開始出錯。。我剛開始覺得是個人‘號的不對,而後嘗試了各類放置位置,到最後我翻了之前數據庫裏的存儲過程,blog

才明白本身把這裏當成了像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

相關文章
相關標籤/搜索