通用分頁存儲過程——節省你的時間,延長程序員的壽命!

[table]
|作者原話:原創作品,允許轉載,轉載時請務必以超鏈接形式標明文章 原始出處 、作者信息和本聲明。否則將追究法律責任。[url]http://51cndo.blog.51cto.com/491222/102320[/url]|
[/table]昨天寫存儲過程時遇到一個麻煩,再搜尋答案時搜到了“通用存儲過程”,但只看到部分殘缺代碼,多方參考後,鄙人對其進行總結規範,得出以下規範存儲過程,竟然把本人項目裏50多個查詢存儲過程代替!不敢獨享,遂貼出與大家分享,希望對大家有所幫助!!

該存儲過程幾乎可以涵蓋所有查詢存儲過程(目前本人還沒有發現不能使用的)

參數:分頁大小,第幾頁,需要得到的字段 ,需要查詢的表 , 查詢條件,排序的字段名,排序的類型,主鍵名稱

輸入參數即可查詢,無論是查詢一條記錄還是查詢多條記錄,無論是分頁還是不分頁,無論是需要查詢條件還是不需要查詢條件……,都可使用此通用的存儲過程!!!
通用性相當好!!
/*通用分頁存儲過程*/
USE HotelManagementSystem
GO
IF EXISTS(SELECT * FROM sys.objects WHERE NAME='cndoup_GetPageOfRecords')
DROP PROCEDURE cndoup_GetPageOfRecords
GO
--創建存儲過程
CREATE PROCEDURE cndoup_GetPageOfRecords
@pageSize int = 20, --分頁大小
@currentPage int , --第幾頁
@columns varchar(1000) = '*', --需要得到的字段
@tableName varchar(100), --需要查詢的表
@condition varchar(1000) = '', --查詢條件, 不用加where關鍵字
@ascColumn varchar(100) = '', --排序的字段名 (即 order by column asc/desc)
@bitOrderType bit = 0, --排序的類型 (0爲升序,1爲降序)
@pkColumn varchar(50) = '' --主鍵名稱

AS
BEGIN --存儲過程開始
DECLARE @strTemp varchar(300)
DECLARE @strSql varchar(5000) --該存儲過程最後執行的語句
DECLARE @strOrderType varchar(1000) --排序類型語句 (order by column asc或者order by column desc)

BEGIN
IF @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 @currentPage = 1 --第一頁
BEGIN
IF @condition != ''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@condition+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+@strOrderType
END

ELSE -- 其他頁
BEGIN
IF @condition !=''
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@condition+' AND '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+
' '+@pkColumn+' FROM '+@tableName'where'+@condition+@strOrderType+') AS TabTemp)'+@strOrderType
ELSE
SET @strSql = 'SELECT TOP '+STR(@pageSize)+' '+@columns+' FROM '+@tableName+
' WHERE '+@pkColumn+@strTemp+'('+@pkColumn+')'+' FROM (SELECT TOP '+STR((@currentPage-1)*@pageSize)+' '+@pkColumn+
' FROM '+@tableName+@strOrderType+') AS TabTemp)'+@strOrderType
END

END
EXEC (@strSql)
END --存儲過程結束

--分頁得到客房信息列表測試
EXEC cndoup_GetPageOfRecords 20,2,'房間號=RoomNum,
房間狀態=(SELECT RoomTypeDes FROM RoomType WHERE RoomTypeID=Room.RoomTypeID),
房間狀態=(SELECT RSDec FROM RoomStatus WHERE RoomStatusID=Room.RoomStatusID),
牀位數=BedNum,
樓層=Floors,
描述=RoomDes,
備註=RoomRemark','Room','','RoomID',0,'RoomID'


--根據房間號得到客房信息測試
EXEC cndoup_GetPageOfRecords 1,1,'房間號=RoomNum,
房間狀態=(SELECT RoomTypeDes FROM RoomType WHERE RoomTypeID=Room.RoomTypeID),
房間狀態=(SELECT RSDec FROM RoomStatus WHERE RoomStatusID=Room.RoomStatusID),
BedNum,
Floors,
RoomDes,
RoomRemark','Room','RoomNum=304','RoomID',0,'RoomID'


--· 得到客房類型信息列表測試
EXEC cndoup_GetPageOfRecords 10,1,'RoomTypeDes,Price,Area,AddBed,MaxBedNum,BedPrice,HourRoom,HourPrice,Remark','RoomType','','RoomTypeID',0,'RoomTypeID'


本文出自 “cndo” 博客,請務必保留此出處[url]http://51cndo.blog.51cto.com/491222/102320[/url]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章