自開始做項目以來,一直在用。這段存儲過程的的原創者(SORRY,忘記名字了),寫得這段SQL代碼很不錯,我在這個基礎上,按照我的習慣以及思維方式,調整了代碼,只做分頁查詢用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
/* ---------------------------------------------- * procedure name : P_PageResult * author :Fay * create date : 2014-07-18 */ CREATE PROCEDURE prcPageResult -- 獲得某一頁的數據 -- @currPage int = 1, --當前頁頁碼 (即Top currPage) @showColumn varchar (2000) = '*' , --需要得到的字段 (即 column1,column2,......) @tabName varchar (2000), --需要查看的表名 (即 from table_name) @strCondition varchar (2000) = '' , --查詢條件 (即 where condition......) 不用加where關鍵字 @ascColumn varchar (100) = '' , --排序的字段名 (即 order by column asc/desc) @bitOrderType bit = 0, --排序的類型 (0為升序,1為降序) @pkColumn varchar (50) = '' , --主鍵名稱 @pageSize int = 20 --分頁大小 AS BEGIN -- 存儲過程開始 -- 該存儲過程需要用到的幾個變量 -- DECLARE @strTemp varchar (1000) DECLARE @strSql varchar (4000) --該存儲過程最后執行的語句 DECLARE @strOrderType varchar (1000) --排序類型語句 (order by column asc或者order by column desc) BEGIN IF @bitOrderType = 1 -- bitOrderType=1即執行降序 BEGIN SET @strOrderType = ' ORDER BY ' +@ascColumn+ ' DESC' SET @strTemp = '<(SELECT min' END ELSE BEGIN SET @strOrderType = ' ORDER BY ' +@ascColumn+ ' ASC' SET @strTemp = '>(SELECT max' END IF @currPage = 1 -- 如果是第一頁 BEGIN IF @strCondition != '' SET @strSql = 'SELECT TOP ' +STR(@pageSize)+ ' ' +@showColumn+ ' FROM ' +@tabName+ ' WHERE ' +@strCondition+@strOrderType ELSE SET @strSql = 'SELECT TOP ' +STR(@pageSize)+ ' ' +@showColumn+ ' FROM ' +@tabName+@strOrderType END ELSE -- 其他頁 BEGIN IF @strCondition != '' SET @strSql = 'SELECT TOP ' +STR(@pageSize)+ ' ' +@showColumn+ ' FROM ' +@tabName+ ' WHERE ' +@strCondition+ ' AND ' +@pkColumn+@strTemp+ '(' +@pkColumn+ ')' + ' FROM (SELECT TOP ' +STR((@currPage-1)*@pageSize)+ ' ' +@pkColumn+ ' FROM ' +@tabName+@strOrderType+ ') AS TabTemp)' +@strOrderType ELSE SET @strSql = 'SELECT TOP ' +STR(@pageSize)+ ' ' +@showColumn+ ' FROM ' +@tabName+ ' WHERE ' +@pkColumn+@strTemp+ '(' +@pkColumn+ ')' + ' FROM (SELECT TOP ' +STR((@currPage-1)*@pageSize)+ ' ' +@pkColumn+ ' FROM ' +@tabName+@strOrderType+ ') AS TabTemp)' +@strOrderType END END EXEC (@strSql) END -- 存儲過程結束 ------------------------------------------------ GO |
調用方法:
prcPageResult 1,'*','TableName','','CreateDate',1,'PkID',25
上面表示,查詢表TableName的所有字段,前25條記錄,因為是第一頁,排序字段為CreateDate,降序排列,主鍵是PkID。這個存儲過程的功能比較強大,用在項目中非常的適用。不信您可以試試看,尤其是在百萬級數據上,他的優勢就顯露無疑了,當然,這段代碼是可以轉換成MySql中的存儲過程的,不過,在這里就不給大家了,你們可以自己試著轉換看看。
下面的存儲過程查詢表的記錄數:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
/* ---------------------------------------------- * procedure name : prcRowsCount * author :Fay * create date : 2014-07-18 */ CREATE PROC prcRowsCount @tabName varchar (200), --需要查詢的表名 @colName varchar (200)= '*' , --需要查詢的列名 @condition varchar (200)= '' --查詢條件 AS BEGIN DECLARE @strSql varchar (255) IF @condition = '' SET @strSql= 'select count(' +@colName+ ') from ' +@tabName ELSE SET @strSql= 'select count(' +@colName+ ') from ' +@tabName+ ' where ' +@condition EXEC (@strSql) END ------------------------------------------------ GO |
還有刪除記錄的通用存儲過程和查詢單條記錄的通用存儲過程在這里就不奉送了,感謝提供原通用分頁查詢存儲過程的哥們,謝謝。