sqlserver 資料庫預存程序分頁

來源:互聯網
上載者:User
  1. SET QUOTED_IDENTIFIER OFF 
  2. GO
  3. SET ANSI_NULLS OFF 
  4. GO
  5. ALTER  PROCEDURE CMS_SearchGetDataByPage 
  6.     @tblName      varchar(255),       -- 表名 
  7.     @fldNames      varchar(1000),     -- 選擇的欄位列表以,分隔 
  8.     @selectOrderFldName      varchar(500),  -- 排序欄位以,分隔(不能含keyFldName指定的欄位,可為空白) 
  9.     @orderFldDesc      varchar(500),  -- 排序欄位及排序方向,如addDate desc,id desc(排序欄位需通過selectOrderFldName指定,可為空白) 
  10.     @keyFldName      varchar(255),     -- 主鍵欄位 
  11.     @PageSize     int = 10,           -- 頁尺寸 
  12.     @PageIndex    int = 1,            -- 頁碼 
  13.     @strWhere     varchar(1000) = ''  -- 查詢條件(注意: 不要加where) 
  14. AS 
  15. declare @strWhereA varchar(1200)            -- 臨時變數,給sqlwhere加where 
  16. declare @strOrderA varchar(2000)            -- 第一次排序類型 
  17. declare @strOrderB varchar(2000)            -- 第二次排序類型 
  18. declare @strSqlA varchar(4000)          -- 第一次選出 
  19. declare @strSqlB varchar(8000)          -- 第二次選出 
  20. declare @strSQL varchar(8000)           -- 最後選出 
  21. /* 條件*/ 
  22. if @strWhere != '' 
  23.     set @strWhereA = ' where ' + @strWhere 
  24. else 
  25.     set @strWhereA = '' 
  26.      
  27. /* 選擇欄位列表*/ 
  28. if @fldNames is null or rtrim(@fldNames) = '' 
  29.     set @fldNames = '*' 
  30.      
  31. /* 排序欄位列表*/ 
  32. if not(@selectOrderFldName is null or rtrim(@selectOrderFldName) = '') 
  33.     if rtrim(@selectOrderFldName) = 'id' 
  34.         set @selectOrderFldName = '' 
  35.     else 
  36.         set @selectOrderFldName = ',' + @selectOrderFldName 
  37.      
  38. /* 構建order,按指定方式排序*/ 
  39. if @orderFldDesc is null or rtrim(@orderFldDesc) = '' 
  40.     set @orderFldDesc = ' order by id desc' 
  41. else 
  42.     set @orderFldDesc = ' order by ' + @orderFldDesc 
  43. set @strOrderA = UPPER(@orderFldDesc) 
  44. set @strOrderB =  replace(@strOrderA,'DESC','DESC1') 
  45. set @strOrderB =  replace(@strOrderB,'ASC','DESC') 
  46. set @strOrderB =  replace(@strOrderB,'DESC1','ASC') 
  47. /* 第一頁*/ 
  48. if @PageIndex = 1 
  49.     set @strSQL = 'select top ' + str(@PageSize) + ' ' + @fldNames + ' from [' + @tblName + '] with(nolock)' + @strWhereA + ' ' + @strOrderA 
  50. else 
  51.     begin 
  52.         --取得總記錄數 
  53.         declare @sql nvarchar(500) 
  54.         declare @maxCount int 
  55.         declare @maxPage int 
  56.         declare @tempRowCount int 
  57.         set @sql ='select @maxCount = count('+@keyFldName+') from [' + @tblName + ']' + @strWhereA 
  58.         exec sp_executesql @sql,N'@maxCount int output',@maxCount output 
  59.         set @maxPage = @maxCount / @PageSize 
  60.         if(@maxCount % @PageSize > 0) 
  61.             set @maxPage = @maxPage + 1 
  62.         /* 最後一頁*/ 
  63.         if @PageIndex >= @maxPage 
  64.             begin 
  65.                 set @PageIndex = @maxPage 
  66.                 set @strSqlA = char(13) + '(select top '+str(@maxCount % @PageSize)+' ' + @keyFldName + @selectOrderFldName + ' from [' + @tblName + '] as a with(nolock) ' + @strWhereA + @strOrderB + '  )' + char(13) 
  67.                 set @strSqlB = char(13) + '(select ' + @keyFldName +' from ' + @strSqlA  + ' as b )' + char(13) 
  68.                 set @strSQL = 'select ' + @fldNames + ' from [' + @tblName + '] where ([' + @keyFldName + '] in '+@strSqlB+')' + @strOrderA + char(13) 
  69.             end 
  70.         else 
  71.             begin 
  72.                 /* 不是第一頁,也不是最後一頁*/ 
  73.                 if(@PageIndex <= @maxPage / 2) 
  74.                     begin 
  75.                     --前半數的頁 
  76.                         set @tempRowCount = @PageIndex * @PageSize 
  77.                         /* 構建SQL,本分頁演算法的目的是為了實現高效的非主鍵排序的分頁。by tony */ 
  78.                         /* 1、先按指定欄位+主鍵欄位按降序選出perPage*pageNum條記錄*/ 
  79.                         set @strSqlA = char(13) + '(select top '+str(@tempRowCount)+' ' + @keyFldName + @selectOrderFldName + ' from [' + @tblName + '] as a  with(nolock) ' + @strWhereA + @strOrderA + '  )' + char(13) 
  80.                         /* 2、再從選出的記錄中按升序選出perPage條記錄*/ 
  81.                         set @strSqlB = char(13) + '(select top '+str(@PageSize)+' ' + @keyFldName + ' from ' + @strSqlA  + ' as b ' + @strOrderB + '  )' + char(13) 
  82.                         /* 3、從資料庫中選出主鍵在第二次選出的記錄中的記錄,按降序排列,分頁完成*/ 
  83.                         set @strSQL = 'select ' + @fldNames + ' from [' + @tblName + '] where ([' + @keyFldName + '] in '+@strSqlB+')' + @strOrderA 
  84.                     end 
  85.                 else 
  86.                     begin 
  87.                     --後半數的頁 
  88.                         set @tempRowCount = @maxCount - (@PageIndex -1) * @PageSize 
  89.                         /* 構建SQL,本分頁演算法的目的是為了實現高效的非主鍵排序的分頁。by tony */ 
  90.                         /* 1、先按指定欄位+主鍵欄位按降序選出perPage*pageNum條記錄*/ 
  91.                         set @strSqlA = char(13) + '(select top '+str(@tempRowCount)+' ' + @keyFldName + @selectOrderFldName + ' from [' + @tblName + '] as a  with(nolock) ' + @strWhereA + @strOrderB + '  )' + char(13) 
  92.                         /* 2、再從選出的記錄中按升序選出perPage條記錄*/ 
  93.                         set @strSqlB = char(13) + '(select top '+str(@PageSize)+' ' + @keyFldName + ' from ' + @strSqlA  + ' as b ' + @strOrderA + '  )' + char(13) 
  94.                         /* 3、從資料庫中選出主鍵在第二次選出的記錄中的記錄,按降序排列,分頁完成*/ 
  95.                         set @strSQL = 'select ' + @fldNames + ' from [' + @tblName + '] where ([' + @keyFldName + '] in '+@strSqlB+')' + @strOrderA 
  96.                     end 
  97.                 end 
  98.     end 
  99. set nocount on 
  100. /*print @strSQL*/ --顯示SQL 
  101. exec (@strSQL) 
  102. set nocount off 
  103. RETURN 
  104. GO
  105. SET QUOTED_IDENTIFIER OFF 
  106. GO
  107. SET ANSI_NULLS ON 
  108. GO
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.