MSSQL 分頁

使用數據庫分頁返回用戶數據有以下好處:
一、減小服務器磁盤系統地讀取壓力
二、減小網絡流量,減輕網絡壓力
三、減輕客戶端顯示數據的壓力
四、提升處理效率。sql

通常而言分頁處理分爲兩種:應用程序中的分頁(查詢出全部數據)處理和數據庫中的分頁處理。目前大多數的應用都是在應用程序中藉助支持數據分頁處理的數據庫訪問組件(如DataGrid控件)實現分頁處理(大部分的分頁插件中也是採用的程序分頁)。實際上,在數據庫中實現分頁處理,能夠從源頭減小數據處理量,效果每每可能更好。數據庫

因此咱們在須要分頁的時候儘可能使用數據庫分頁效果是更好的。緩存

常規的取第n頁數據方法爲服務器

SELECT TOP PageSize * FROM TableA WHERE Primary_Key NOT IN (SELECT TOP (n-1) * PageSize Primary_Key FROM TableA )  

這樣的若是改爲存儲過程大概是這樣的網絡

CREATE PROC up_PageView ( @tableName SYSNAME ,
                          @colKey NVARCHAR(100) ,
                          @pageCurrent INT = 1 ,
                          @pageSize INT = 10 ,
                          @colShow NVARCHAR(4000) = '' ,
                          @colOrder NVARCHAR(200) = '' ,
                          @where NVARCHAR(2000) = '' ,
                          @pageCount INT OUTPUT )
AS 
   BEGIN
      IF OBJECT_ID(@tableName) IS NULL 
         BEGIN
            RAISERROR('the table is not existing!', 16,1)
            RETURN 
         END
      IF ISNULL(@colShow,'') = '' 
         SET @colShow = '*'
      IF ISNULL(@colOrder,'') = '' 
         SET @colOrder = ''
      ELSE 
         SET @colOrder = 'order by ' + @colOrder
      IF ISNULL(@where,'') = '' 
         SET @where = ''
      ELSE 
         SET @where = 'where ' + @where
      DECLARE @sql NVARCHAR(4000)
      IF @pageCount IS NULL 
         BEGIN
            SET @sql = 'select @pageCount = count(*) from ' + @tableName + ' ' + @where
            EXEC sp_executesql 
               @sql ,
               '@pageCount int output' ,
               @pageCount OUTPUT
            SET @pageCount = ( @pageCount + @pageSize - 1 ) / @pageSize -- get total pages
         END
      IF @pageCurrent = 1 
         BEGIN
            SET @sql = N'select top' + N' ' + CONVERT(NVARCHAR(10),@pageSize) + N' ' + @colshow + N' ' + N'from '
               + @tableName + N' ' + @where + N' ' + @colOrder
            EXEC (@sql)
         END
      ELSE 
         BEGIN
            DECLARE @topN INT ,
               @topN1 INT
--        set @topN = @pageSize
--        set @topN1 = @pageCurrent * @pageSize
            SET @pageCurrent = @pageCurrent * @pageSize
            SET @sql = N'select @n = @n - 1, @s = case when @n < ' + CONVERT(NVARCHAR(10),@pageSize)
               + N' then @s + '','' + quotename(@colKey, N'''''''') ' + N'else ''''' + N' end ' + N' from ' + @tableName
               + N' ' + @where
        --make query effect only @pageCurrent records
        --Query only top @pageCurrent * @pageSize
            SET ROWCOUNT @pageCurrent 
            EXEC sp_executesql 
               @sql ,
               '@n int, @s nvarchar(max) output' ,
               @pageCurrent ,
               @sql OUTPUT
            SET ROWCOUNT 0 --recover to default config
            SET @sql = STUFF(@sql,1,1,N'') -- remove the first ','
        --exec the query
            EXEC (N'select ' + @colShow + N' ' + 'from' + N' ' + @tableName + N' '  
            + N'where ' + @colKey + N' in (' + @sql + ')' + @colOrder)
         END
   END
go

可是這種執行起來效率比較低,這樣是把 top n 取大量的數據並緩存起來,在關聯元表查詢出最終結果。函數

下面咱們採用另外一種方法,在 sql server 2005 之後增長了一些新的功能如取得排名或順序的函數(Rank(), Dense_Rank(), Row_Number()), 利用這些新的功能也能進行分頁處理,下面以sql server 2005 自帶的數據庫AdventureWorks爲例結合Row_Number() 實現分頁處理:spa

CREATE PROC up_GetPagen ( @pageSize INT ,
                          @pageCurrent INT ,
                          @countPage INT OUTPUT )
AS 
   BEGIN
      SELECT *
         FROM (
                SELECT ROW_NUMBER () OVER (ORDER BY id) RowNum,* FROM TableA
              ) TA
         WHERE RowNum BETWEEN ( @pageCurrent - 1 ) * @pageSize + 1 AND @pageCurrent * @pageSize
         ORDER BY Id
         
      --另加一個返回總記錄數吧。
      SELECT @countPage = COUNT(0)
         FROM TableA
   END
相關文章
相關標籤/搜索