看板 C_Sharp 關於我們 聯絡資訊
※ 引述《tomex (Tomex Ou)》之銘言: : ASP.NET網頁設計裏, : 原以為觀看detail資料的下方有個上一頁/下一頁很簡單 : 發現ASP.NET的Paper都是丟所有資料Datable : 我嫌這樣資料量太大(畢竟只有1筆而己) : 改用手寫下sql方式。 : 以為多下兩道大於或小於該key值的sql就好 : 但是考量此上/下頁的順序, : 是根據前頁資料列表的排序規則(可能多欄排序) : 細想之下,發現真的不簡單... : 因為sql表中的資料並不一定連續。 : 請問該如何在不查詢所有資料下 : 得到指定筆項目的上/下筆資料呢? : 難道最終仍是得把所有資料取出嗎? : 不甘心呀!! CREATE PROCEDURE sp_Paging @tblName varchar(255) , @strGetFields varchar(1000) = '*', @fldName varchar(255)='', @pageSize int = 10, @pageIndex int = 1, @recordCount int = 0 output, @pageCount int = 0 output, @orderType int = 0, @strWhere varchar(1500) = '' AS declare @strSQL nvarchar(3000) declare @strTmp varchar(110) declare @strOrder varchar(400) begin if @strWhere !='' set @strSQL = 'select @recordCount = count(*) from ' + @tblName + ' where '+@strWhere else set @strSQL = 'select @recordCount = count(*) from ' + @tblName end exec sp_executesql @strSQL,N'@recordCount int out ',@recordCount out if @recordCount % @pageSize = 0 set @pageCount = @recordCount / @pageSize else set @pageCount = @recordCount / @pageSize + 1 --計算出記錄是總數和求出總共的頁數 begin if @orderType != 0 begin set @strTmp = '<(select min' set @strOrder = ' order by ' + @fldName +' desc' --如果@orderType不是0﹐就執行降序﹐這句很重要﹗ end else begin set @strTmp = '>(select max' set @strOrder = ' order by ' + @fldName +' asc' end if @pageIndex = 1 begin if @strWhere != '' set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder else set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from '+ @tblName + ' '+ @strOrder end else begin if @strWhere != '' set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @fldName + '' + @strTmp + '(' + substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' ' + @fldName + ' from ' + @tblName + ' where ' + @strWhere + ' ' + @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder else set @strSQL = 'select top ' + str(@pageSize) +' '+@strGetFields+ ' from ' + @tblName + ' where ' + @fldName + '' + @strTmp + '(' + substring(@fldName, charindex('.',@fldName)+1, len(@fldName)) + ') from (select top ' + str((@pageIndex-1)*@pageSize) + ' ' + @fldName + '  from ' + @tblName + '' + @strOrder + ') as tblTmp)' + @strOrder end end --print @strSQL exec sp_executesql @strSQL GO -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 222.221.168.156