sql分页存储过程,带求和、排序

  • 创建存储过程:
CREATE PROCEDURE [dbo].[sp_TBTest_Query]
    (
        @PageSize INT,                        --每页多少条记录
        @PageIndex INT = 1,                    --指定当前为第几页
        @PageCount INT    OUTPUT,                --返回总页数
        @RecordCount INT OUTPUT,            --记录总和

        @OrderField VARCHAR(5000),            --排序字段(多字段,不含Order By)
        @strWhere VARCHAR(5000),            --条件语句(不用加where)

        @SumColumnNames NVARCHAR(200),        --汇总字段
        @SumResult NVARCHAR(200) OUTPUT        --返回汇总结果
    )
AS
    BEGIN
        DECLARE @SQL NVARCHAR(MAX) = ‘‘;
        --条件处理
        IF ISNULL(@strWhere, ‘‘) =‘‘
        BEGIN
          SET @strWhere=‘1=1 ‘
        end

        --计算总记录数
        SET @SQL = N‘SELECT @A = count(*) FROM TBTest where ‘+ @strWhere
        EXEC sp_executesql @SQL, N‘@A int OUTPUT‘, @RecordCount OUTPUT;

        --计算总页数
        SELECT  @PageCount = CEILING(( @RecordCount + 0.0 ) / @PageSize);

        --处理页数超出范围情况
        IF @PageIndex <= 0
            SET @PageIndex = 1;

        IF @PageIndex > @PageCount
            SET @PageIndex = @PageCount;

         --处理开始点和结束点
        DECLARE @StartRecord INT;
        DECLARE @EndRecord INT;

        SET @StartRecord = ( @PageIndex - 1 ) * @PageSize + 1;
        SET @EndRecord = @StartRecord + @PageSize - 1;

        --计算汇总
        IF ISNULL(@SumColumnNames, ‘‘) <> ‘‘
            BEGIN
                SET @SQL = N‘SELECT @A = (CAST(ISNULL(SUM(‘
                    + REPLACE(@SumColumnNames, ‘,‘,‘), 0) AS NVARCHAR(30)) + ‘‘,‘‘ + CAST(ISNULL(SUM(‘)
                    + ‘), 0) AS NVARCHAR(30))) FROM TBTest where ‘+@strWhere +‘ ‘
                EXEC sp_executesql @SQL, N‘@A NVARCHAR(200) OUTPUT‘, @SumResult OUTPUT;
            END 

        --返回结果
       SET @sql=N‘ SELECT * FROM (  SELECT  * ,ROW_NUMBER() OVER(ORDER BY id DESC) AS RowID
        FROM    TBTest where ‘+@strWhere +N‘) t
        WHERE   RowID BETWEEN ‘+CONVERT(NVARCHAR(10),@StartRecord)+N‘ AND ‘+CONVERT(NVARCHAR(10),@EndRecord)
        EXEC sp_executesql @SQL
    END
  • 调用代码
     DECLARE    @PageSize INT=10,                        --每页多少条记录
        @PageIndex INT = 2,                    --指定当前为第几页
        @PageCount INT     ,                --返回总页数
        @RecordCount INT  ,            --记录总和

        @OrderField VARCHAR(5000)=‘ID‘,            --排序字段(多字段,不含Order By)
        @strWhere VARCHAR(5000)=‘‘,            --条件语句(不用加where)

        @SumColumnNames NVARCHAR(200)=‘Age‘,        --汇总字段
        @SumResult NVARCHAR(200)          --返回汇总结果

EXEC   sp_TBTest_Query  @PageSize,@PageIndex,@PageCount OUTPUT,@RecordCount OUTPUT,@OrderField,@strWhere,@SumColumnNames,@SumResult OUTPUT

SELECT @PageCount AS ‘PageCount‘,@RecordCount AS ‘RecordCount‘,@SumResult AS ‘SUM‘
  • 测试结果

我在项目中遇到一个问题,就是元数据由分组,然后再连接,为了加快查询效率,我不得不剔除传入Where条件字符串中的一个条件,大概写法如下:

DECLARE @strWhere NVARCHAR(max)=‘ID=1 and Age=2 and address=‘‘销售部‘‘‘
DECLARE @str1 NVARCHAR(max)=‘‘
DECLARE @str2 NVARCHAR(max)=‘‘
IF ISNULL(@strWhere, ‘‘)<>‘‘
BEGIN
IF( CHARINDEX(‘Age‘,@strWhere)>0 )
BEGIN
SET @str1 =SUBSTRING(@strWhere,CHARINDEX(‘Age‘,@strWhere),LEN(@strWhere))
if CHARINDEX(‘and‘,@str1)>0
begin
SET @str2 =SUBSTRING(@str1,CHARINDEX(‘and‘,@str1),LEN(@str1))
end

SET @strWhere=SUBSTRING(@strWhere,0,CHARINDEX(‘Age‘,@strWhere))+N‘ 1=1 ‘[email protected]

end

END

时间: 2024-10-26 09:06:36

sql分页存储过程,带求和、排序的相关文章

[转]关于SQL分页存储过程的分析

[转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合

真正通用的SQL分页存储过程

关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加了索引,以方便大数据量的使用(代码中是先抓到临时表的,从性能上说如果采用自增长式的ID表,当然可以不使用临时表以达到性能的提升).以下代码的SP是经过我们项目使用通过的.因朋友问及此问题,我就放在这里供大家分享,如各位大侠有更好的方法,也请告诉我.在这里先感谢各位了. 1 CREATE PROCED

完整SQL分页存储过程(支持多表联接)

http://www.cnblogs.com/andiki/archive/2009/03/24/1420289.html Code/********************************************************* * 作 用:数据分页(完整SQL分页存储过程(支持多表联接))* 作 者:齐李平* 创建日期:2009-03-23* 使用说明: 1.单表调用方法:EXEC proc_DataPagination @tblName = 'ipa',@fldName

关于SQL分页存储过程的分析

建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适用于较小数据量的情形,因为游标本身有缺点:游标是存放在内存 中,很费内存.游标一建立,就将相关的记录锁住,直到取消游标.游标提供了对特定集合中逐行扫描的手段,一般使用游标来逐行遍历数据,根据取出数据条件的 不同进行不同的操作.而对于多表和大表中定义的游标(大的数据集合)循环很容易使程序进入一个漫长

SQL 分页存储过程 以及SQL concatenate 几种方法

1 USE [GPP] 2 GO 3 /****** Object: StoredProcedure [dbo].[P_V_USER_INFO_ROLE_SCHEME_S_PAGE_BY_APPID_ROLEID] Script Date: 14/11/2014 10:10:36 AM ******/ 4 SET ANSI_NULLS ON 5 GO 6 SET QUOTED_IDENTIFIER ON 7 GO 8 ALTER PROC [dbo].[P_V_USER_INFO_ROLE_SC

mybatis中的分页并且带了排序效果

<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">今天做了一下测试,测试发现分页中存在一些问题:</span> 分页中的排序效果没有显示出来.首先看下排序中的一些注意的事项: 1. #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是111,那么解析成sql

MS SQL 分页存储过程

最近换了家新公司,但是新公司没有使用分页的存储过程.哎~~,硬着头皮自己尝试写了一个,别说还挺好用的.(效率怎么样就不怎么清除没有详细的测试过) CREATE PROCEDURE [dbo].[pro_common_pageList] ( @tab NVARCHAR(MAX) ,---表名 @PrimaryKey VARCHAR(100) , --主键ID @strFld NVARCHAR(MAX) , --字段字符串 @strWhere NVARCHAR(MAX) = ' ' , --wher

sql分页存储过程

USE [DBName]GO/****** Object: StoredProcedure [dbo].[UP_GetRecordByPage] Script Date: 12/05/2012 16:17:11 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGO ALTER PROCEDURE [dbo].[UP_GetRecordByPage] @tblName varchar(255), -- 表名 @fldName varchar(25

Sql分页存储过程及调用

Alter Proc P_Page( @TblName varchar(200), --表名 @PageSize int, --每页显示条数 @PageIndex int = 1, --页面索引(页码) @strGetFields varchar(1000)='*', --无传入值,则搜索所有列 @OrderType int = 0, --是否倒序(0=否,1=是) @FldName varchar(100), --以什么条件进行倒叙 @StrWhere varchar(2000), --查询条