對(duì)SQL Server中任意select語(yǔ)句分頁(yè)的存儲(chǔ)過(guò)程
對(duì)SQL Server中任意select語(yǔ)句,如何才能分頁(yè)呢?下面將為您建立一個(gè)通用的存儲(chǔ)過(guò)程,對(duì)SQL Server中任意select語(yǔ)句進(jìn)行分頁(yè),供您參考。
CREATE PROCEDURE [dbo].[usp_ResultWithPage]
@fields_Type varchar(1000),     --字段列表(帶類(lèi)型),用于@t表變量的字段聲明,如:PhotoID int,UserID int,PhotoTitle nvarchar(50)
@fieldsInT varchar(500),     --字段列表(不帶類(lèi)型),用于分頁(yè)部分讀取@t表變量的字段,也可使用*代替,但性能會(huì)下降,如:PhotoID ,UserID ,PhotoTitle
@selectSrting varchar(2000),     --向@t表變量中讀取記錄的Select語(yǔ)句,如:SELECT PhotoID ,UserID ,PhotoTitle FROM Photo_Basic
@result_OrderBy varchar(200),     --對(duì)分頁(yè)結(jié)果進(jìn)行排序的字段,如:升序'PhotoID ASC'、降序'PhotoID DESC'
@pageSize int,     --頁(yè)尺寸,0表示返回所有行
@currentPage int,     --當(dāng)前頁(yè),首頁(yè)為1
@IsReCount bit     -- 非0值則返回記錄總數(shù)
AS
BEGIN
---------------得到表變量@t-------------------------
DECLARE   @strSql   varchar(2000)
SET @strSql = 'DECLARE @t TABLE(' + @fields_Type + ');'
SET @strSql = @strSql + 'INSERT  INTO @t ' + @selectSrting + ';'
--顯示表變量的內(nèi)容
--SET @strSql = @strSql + 'SELECT ' + @fieldsInT + ' FROM @t;'
----------進(jìn)行分頁(yè)------------------------------------
IF   @pageSize   =   0
    SET   @strSql  = @strSql +  'SELECT '   +   @fieldsInT  + ' FROM @t ;'
ELSE
    IF   @currentPage   =   1
        SET   @strSql   = @strSql +     'SELECT TOP( ' + Str(@pageSize) + ') ' + @fieldsInT + ' FROM @t ;'
    ELSE
    BEGIN
SET   @strSql   = @strSql +  'SELECT TOP( ' + Str(@pageSize) + ') * FROM ( SELECT TOP(' + Str(@pageSize * @currentPage) + ') *, ROW_NUMBER() OVER (ORDER BY ' + @result_OrderBy + ')'
SET   @strSql   = @strSql +  ' AS   RowNumber   FROM  @t'
SET   @strSql   = @strSql +  ' ) AS r WHERE   r.RowNumber   >  ' + Str(@pageSize * (@currentPage - 1)) + ';'
    END
IF @IsReCount != 0
    SET @strSql = 'SELECT COUNT(1) AS Total FROM @t ;'
--RETURN @strSql
EXEC(@strSql)
-----------------------
END
總結(jié)一下,主要思想還是用了sql server 的 top row_number函數(shù)。
 
【編輯推薦】
使用SQL中SELECT語(yǔ)句的使用條件邏輯
SQL語(yǔ)句中SELECT語(yǔ)句的執(zhí)行順序















 
 
 
 
 
 
 