--經過一段時間的使用,這個存儲過程發現了一些不完美的地方,主要體現在排序的問題上面,一般排序都應該是把最新的顯示在前面的,修改前的只能指定一個字段進行排序,而且還需要指定是按降序還是升序來排,而且使用的時候排序只在當前也排序,而不是針對所有記錄來排序,現修改后版本如下:可以指定多個字段排序,并且是針對所有滿足條件的記錄進行排序。
SET ANSI_NULLS ONGO
SET QUOTED_IDENTIFIER ONGO
-- Batch submitted through debugger: SQLQuery8.sql|0|0|C:/Users/Administrator/AppData/Local/Temp/~vsBEFB.sql/****** Object: StoredPRocedure [dbo].[Proc_PageData] Script Date: 03/12/2012 16:38:59 ******/
CREATE PROCEDURE [dbo].[Proc_PageData](@tblName nvarchar(200), ----要顯示的表或多個表的連接@fldName nvarchar(2000) = '*', ----要顯示的字段列表@pageSize int = 100, ----每頁顯示的記錄個數@page int = 1, ----要顯示那一頁的記錄@pageCount int = 1 output, ----查詢結果分頁后的總頁數@Counts int = 1 output, ----查詢到的記錄數@ID nvarchar(50), ----主表的主鍵@fldSort nvarchar(1000) ='', ----排序字段列表或條件@Sort bit = 0, ----排序方法,0為升序,1為降序@strCondition nvarchar(2000) ='' ----查詢條件,不需where)ASSET NOCOUNT ONDeclare @sqlTmp nvarchar(1000) ----存放動態生成的SQL語句Declare @strTmp nvarchar(1000) ----存放取得查詢結果總數的查詢語句Declare @strID nvarchar(1000) ----存放取得查詢開頭或結尾ID的查詢語句Declare @sqlSort nvarchar(200) ----存放臨時生成的排序條件Declare @intCounts int ----要移動的記錄數Declare @BeginID int ----開始的IDDeclare @EndID int ----結束的IDdeclare @tempID intdeclare @topstr nvarchar(1000)declare @conditionStr nvarchar(1000)--------首先生成排序方法-----------if @Sort=0 --升序--beginif @fldSort <>''set @sqlSort = ' Order by ' + @fldSort elseset @sqlSort = ' Order by ' + @ID +' DESC'--end--else --降序--begin--if @fldSort='' -- set @sqlSort = ' Order by ' + @ID + ' DESC '--else -- set @sqlSort = ' Order by ' + @fldSort --end--------生成查詢語句----------此處@strTmp為取得查詢結果數量的語句if @strCondition='' --沒有設置顯示條件beginset @sqlTmp = @fldName + ' From ' + @tblNameset @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblNameset @strID = ' From ' + @tblName+ ' '+@sqlSortendelsebeginset @sqlTmp = + @fldName + 'From ' + @tblName set @strTmp = 'select @Counts=Count(' + @ID + ') FROM '+@tblName + ' where ' + @strConditionset @strID = ' From ' + @tblName + ' where ' + @strCondition + ' '+@sqlSortend--print @strID----取得查詢結果總數量-----exec sp_executesql @strTmp,N'@Counts int out ',@Counts out--取得分頁總數if @Counts <= @pageSizeset @pageCount = 1elsebeginif @Counts%@PageSize=0 set @pageCount = (@Counts / @pageSize) elseset @pageCount = (@Counts / @pageSize) + 1endset @topstr=' top '+Convert(nvarchar,@pageSize)--計算要移動的記錄數if @page = 1 --加快處理begin-----取得分頁后此頁的第一條記錄的IDset @conditionStr=''end elsebegin-----取得分頁后此頁的第一條記錄的IDif @pageCount>1begindeclare @topnum intset @topnum=(@page-1)*@PageSizeset @conditionStr=' '+@ID+' not in(select top '+ Convert(nvarchar,@topnum)+' '+@ID+' from '+@tblName+@sqlSort+')'endelseset @conditionStr=''end --print @strIDif @BeginID>@EndIDbegin set @tempID=@BeginID set @BeginID=@EndID set @EndID=@tempIDend------恢復系統設置-----set rowcount 0SET NOCOUNT ON------返回查詢結果-----if @strCondition=''begin if @conditionStr='' set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp else set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @conditionStrendelsebeginif @conditionStr=''set @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @strConditionelseset @strTmp = 'select ' + @topstr + ' ' + @sqlTmp + ' where ' + @strCondition +' and '+@conditionStrend--if @conditionStr<>''--set @strTmp=@strTmp+@conditionStrif @sqlSort<>''set @strTmp = @strTmp+@sqlSort--print @strTmp--print @topstrexec sp_executesql @strTmp
新聞熱點
疑難解答