最近沒事試着寫一些簡單的存儲過程,因爲之前不多用到或者不多本身寫存儲過程。因此歷盡各類艱難,讓本身也備受打擊。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
另外一種使用的是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的時候最後須要拼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