• SQL 分页通用存储过程


    USE [DB]
    GO
    /****** Object:  StoredProcedure [dbo].[SP_AspNetPager]    Script Date: 10/23/2015 16:37:33 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    
    
    ALTER PROCEDURE [dbo].[SP_AspNetPager]
        @PageSize INT = 10 , -- 页尺寸
        @PageIndex INT = 1 , -- 页码
        @TableName VARCHAR(255) , -- 表名 
        @KeyFields VARCHAR(255) = '' , -- 排序的字段名
        @ShowFields VARCHAR(1000) = '*' , -- 需要返回的列
        @OrderType BIT = 0 , -- 设置排序类型, 非 0 值则降序
        @WhereString VARCHAR(1500) = '', -- 查询条件 (注意: 不要加 where)
        @OrderFields VARCHAR(1000)='',      --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
        @RecordCount int OUTPUT             --总页数
    AS 
        DECLARE @StrSQL VARCHAR(5000)       -- 主语句
        DECLARE @StrTmp VARCHAR(110)        -- 临时变量
        DECLARE @StrOrder VARCHAR(400)        -- 排序类型
    
        IF @RecordCount IS NULL
        BEGIN
            DECLARE @sql nvarchar(4000)
            SET @sql=N'SELECT @RecordCount=COUNT(*)'
                +N' FROM '+@TableName
                +N' WHERE '+@WhereString
            EXEC sp_executesql @sql,N'@RecordCount int OUTPUT',@RecordCount OUTPUT
        end
        
        --以上代码的意思是如果@DoCount传递过来的不是0,就执行总数统计。以下的所有代码都是@DoCount为0的情况
        IF @OrderType != 0 
        BEGIN
            SET @StrTmp = '<(select min'
            SET @StrOrder = ' order by [' + @KeyFields + '] desc'
            --如果@OrderType不是0,就执行降序,这句很重要!
        END
        ELSE 
        BEGIN
            SET @StrTmp = '>(select max'
            SET @StrOrder = ' order by [' + @KeyFields + '] asc'
        END
        IF @PageIndex = 1 
        BEGIN
            IF @WhereString != '' 
                SET @StrSQL = 'select top ' + STR(@PageSize) + ' '
                    + @ShowFields + '  from [' + @TableName
                    + '] where ' + @WhereString + ' ' + @StrOrder
            ELSE 
                SET @StrSQL = 'select top ' + STR(@PageSize) + ' '
                    + @ShowFields + '  from [' + @TableName + '] '
                    + @StrOrder
            --如果是第一页就执行以上代码,这样会加快执行速度
        END
        ELSE 
        BEGIN
            --以下代码赋予了@StrSQL以真正执行的SQL代码
            SET @StrSQL = 'select top ' + STR(@PageSize) + ' '
                + @ShowFields + '  from [' + @TableName + '] where ['
                + @KeyFields + ']' + @StrTmp + '([' + @KeyFields
                + ']) from (select top ' + STR(( @PageIndex - 1 )
                                               * @PageSize) + ' ['
                + @KeyFields + '] from [' + @TableName + ']' + @StrOrder
                + ') as tblTmp)' + @StrOrder
            IF @WhereString != '' 
                SET @StrSQL = 'select top ' + STR(@PageSize) + ' '
                    + @ShowFields + '  from [' + @TableName
                    + '] where [' + @KeyFields + ']' + @StrTmp + '(['
                    + @KeyFields + ']) from (select top '
                    + STR(( @PageIndex - 1 ) * @PageSize) + ' ['
                    + @KeyFields + '] from [' + @TableName + '] where '
                    + @WhereString + ' ' + @StrOrder
                    + ') as tblTmp) and ' + @WhereString + ' '
                    + @StrOrder
        END 
        EXEC (@StrSQL)
  • 相关阅读:
    hdu 3722 Card Game 二分图的最大权匹配
    如何将中国知网CNKI中的文献导入EndNote X6
    高性能以太网芯片W5500 数据手册 V1.0(二)
    (贪心5.1.2)POJ 2287 Tian Ji -- The Horse Racing
    [置顶] 斗地主算法的设计与实现--项目介绍&如何定义和构造一张牌
    Robotium学习笔记一
    Robotium学习笔记二
    Robotium学习笔记三
    做一个测试经理我还差多少?
    [每日一题] 11gOCP 1z0-053 :2013-10-9 backup with the KEEP option....................................33
  • 原文地址:https://www.cnblogs.com/rwh871212/p/4904993.html
Copyright © 2020-2023  润新知