zoukankan      html  css  js  c++  java
  • 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)
  • 相关阅读:
    君の知らない物語
    2.OSI各层概述
    [ unittest ] 使用初体验
    1.分层结构、协议、接口、服务
    [flask] jinja自定义filter来过滤html标签
    [Flask] Flask问题集(后端模板渲染项目)
    [服务器部署] Flask + virtualenv + uWSGI + Nginx 遇到的问题
    android控件的对齐方式(转)
    AIDL
    歌词的获取
  • 原文地址:https://www.cnblogs.com/rwh871212/p/4904993.html
Copyright © 2011-2022 走看看