您的位置:首页 > 其它

毫秒级百万数据分页存储过程

2016-06-15 13:58 232 查看
create table student

(

sno int ,

sname VARCHAR(200)

)

DECLARE @LN VARCHAR(300),@MN VARCHAR(200),@FN VARCHAR(200)

DECLARE @LN_N INT,@MN_N INT,@FN_N INT

SET @LN='李王张刘陈杨黄赵周吴徐孙朱马胡郭林何高梁郑罗宋谢唐韩曹许邓萧冯曾程蔡彭潘袁于董余苏叶吕魏蒋田杜丁沈姜范江傅钟卢汪戴崔任陆廖姚方金邱夏谭韦贾邹石熊孟秦阎薛侯雷白龙段郝孔邵史毛常万顾赖武康贺严尹钱施牛洪龚'

SET @MN='德绍宗邦裕傅家積善昌世贻维孝友继绪定呈祥大正启仕执必定仲元魁家生先泽远永盛在人为任伐风树秀文光谨潭棰'

SET @FN='丽云峰磊亮宏红洪量良梁良粮靓七旗奇琪谋牟弭米密祢磊类蕾肋庆情清青兴幸星刑'

SET @LN_N=LEN(@LN)

SET @MN_N=LEN(@MN)

SET @FN_N=LEN(@FN)

DECLARE @TMP VARCHAR(1000),@I INT

SET @I=100

WHILE @I<1000000

BEGIN

    SET @TMP=CAST(SUBSTRING(@LN,CAST(RAND()*@LN_N AS INT),1) AS VARCHAR)

    SET @TMP=@TMP+CAST(SUBSTRING(@MN,CAST(RAND()*@MN_N AS INT),1) AS VARCHAR)

    SET @TMP=@TMP+CAST(SUBSTRING(@FN,CAST(RAND()*@FN_N AS INT),1) AS VARCHAR)

    INSERT INTO student(sno,sname)VALUES('2005'+@I,@TMP)

    SET @I=@I+1

end

-- =============================================

-- Author:      im531

-- Create date: 2010-10-25

-- Description: SQL 2005 ROW_NUMBER 分页

-- Modify Date: 2010-10-26

-- =============================================

 

CREATE PROCEDURE [dbo].[im531_Page]

    @TabeName AS NVARCHAR(50),

    @Fields AS NVARCHAR(1024),

    @SearchWhere AS NVARCHAR(1024),

    @OrderFields AS NVARCHAR(1024),

    @pageNumber AS INT,

    @page AS INT

AS

BEGIN

    SET NOCOUNT ON;

    DECLARE @sqlType AS TINYINT

    SET @sqlType = 0  -- 0 BETWEEN   1 TOP

    DECLARE @sql AS NVARCHAR(MAX)

    IF @SearchWhere <> '' SET @SearchWhere = ' WHERE ' + @SearchWhere

    IF @page < 2 SET @page = 1

    IF @page = 1

        BEGIN

            SET @sql = 'SELECT TOP ' + CONVERT(NVARCHAR(20),@pageNumber) + ' ' + @Fields

                + 'FROM [' + @TabeName + '][a] WITH(NOLOCK) ' + @SearchWhere + ' ORDER BY ' + @OrderFields

        END

    ELSE

        BEGIN

            --临时表

            SET @sql = ';WITH [Page_____Table] AS('

                + 'SELECT ROW_NUMBER() OVER(ORDER BY ' + @OrderFields + ') AS [RowNow],' + @Fields

                + 'FROM ['+ @TabeName +' ][a] WITH(NOLOCK) ' + @SearchWhere

                + ')'

            --查找当前页面记录

            IF @sqlType = 0

                BEGIN

                -- A USE BETWEEN

                    SET @sql = @sql + 'SELECT *'

                        + 'FROM [Page_____Table] WITH(NOLOCK)'

                        + 'WHERE [RowNow] BETWEEN ' + CONVERT(NVARCHAR(20),(@page - 1) * @pageNumber + 1) + ' AND ' + CONVERT(NVARCHAR(20),@page * @pageNumber)

                        + 'ORDER BY [RowNow]'

                END

            ELSE

                BEGIN

                -- B USE TOP

                    SET @sql = @sql + 'SELECT TOP ' + CONVERT(NVARCHAR(20),@pageNumber) + ' *'

                        + 'FROM [Page_____Table] WITH(NOLOCK)'

                        + 'WHERE [RowNow] > ' + CONVERT(NVARCHAR(20),(@page - 1) * @pageNumber)

                        + 'ORDER BY [RowNow]'

                END

        END

    EXEC(@sql)

END

------------------------------------------

DECLARE @d DATETIME

SET @d = GETDATE()

 

DECLARE @M AS INT;DECLARE @N AS INT;DECLARE @cPage AS INT

SET @M = 50000;SET @N = 1

SET @cPage = CAST((rand()*(@M-@N)+@N) AS INT)

 

EXECUTE [im531_Page]

    @TabeName = 'student',--表名

    @Fields = '[sno],[sname]',--查询字段

    @SearchWhere = '[sno] > 0',--查询条件

    @OrderFields = '[sno] DESC',--排序

    @pageNumber = 10,--每页显示条数

    @page = 61--当前第几页

 

 

SELECT [当前页] = @cPage,[分页执行耗时间(毫秒)] = DATEDIFF(ms,@d,GETDATE())
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: