create procedure proc_page_withtopmax
(
@pageIndex int,--页索引
@pageSize int,--每页显示数
@pageCount int output,--总页数,输出参数
@totalCount int output--总条数
)
as
begin
set nocount on;

declare @sql nvarchar(1000)
set @sql='select top 10 * from tb_testtable where (id> (select max(id) from (select top '+str((@pageIndex-1)*@pageSize)+' id from tb_testtable order by id) as temp)) order by id'
execute(@sql)

declare @sqlRecordCount nvarchar(1000) --得到总记录条数的语句
set @sqlRecordCount=N'select @recordCount=count(*) from tb_testtable'
declare @recordCount int --保存总记录条数的变量
exec sp_executesql @sqlRecordCount,N'@recordCount int output',@recordCount output

if( @recordCount % @pageSize = 0) --如果总记录条数可以被页大小整除
set @pageCount = @recordCount / @pageSize --总页数就等于总记录条数除以页大小
else --如果总记录条数不能被页大小整除
set @pageCount = @recordCount / @pageSize + 1 --总页数就等于总记录条数除以页大小加1

set @totalCount = @recordCount

set nocount off;
end

--数据库中执行该存储过程
declare @pageCount int, @totalCount int

exec proc_page_withtopmax 2,95955,@pageCount output,@totalCount output

select '总页数:'+str(@pageCount)
select '总条数:'+str(@totalCount)

C# 代码调用该带输入输出参数的分页存储过程

public static DataSet GetRecordByPage( int pageSize, int pageIndex, out int pageCount, out int totalCount)
{
DataSet ds = new DataSet();
try
{
using (SqlConnection conn = new SqlConnection(@"server=;database=data_test;uid=; pwd=;"))
{
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.Parameters.Add(new SqlParameter("@pageSize", SqlDbType.Int));
cmd.Parameters.Add(new SqlParameter("@pageIndex", SqlDbType.Int));
SqlParameter param = new SqlParameter("@totalCount", SqlDbType.Int);
param.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param);

SqlParameter param1 = new SqlParameter("@pageCount", SqlDbType.Int);
param1.Direction = ParameterDirection.Output;
cmd.Parameters.Add(param1);

cmd.Parameters[0].Value = pageSize;
cmd.Parameters[1].Value = pageIndex;
cmd.Parameters[2].Value = 0;
cmd.Parameters[3].Value = 0;

cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_page_withtopmax";
cmd.CommandTimeout = 180;

SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;

DataSet source = new DataSet();
adapter.Fill(ds);

object o = cmd.Parameters["@totalCount"].Value;
totalCount = (o == null || o == DBNull.Value) ? 0 : System.Convert.ToInt32(o);

object b = cmd.Parameters["@pageCount"].Value;
pageCount = (b == null || o == DBNull.Value) ? 0 : System.Convert.ToInt32(b);
}
}
catch (SqlException e)
{
throw e;
}
return ds;
}

}

sql server 带输入输出参数的分页存储过程(效率最高)的更多相关文章

  1. C# 调用带有输出参数的分页存储过程

    一.创建带有输出参数的分页存储过程 use StudentMISDB go select * from Course alter table Course go --update Course set ...

  2. SQL Server编程(03)自定义存储过程

    存储过程是一组预编译的SQL语句,它可以包含数据操纵语句.变量.逻辑控制语句等. 存储过程允许带参数: 输入参数:可以在调用时向存储过程传递参数,此类参数可用来向存储过程中传入值(可以有默认值) 输出 ...

  3. 如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?

    如何在SQL Server查询语句(Select)中检索存储过程(Store Procedure)的结果集?(2006-12-14 09:25:36) 与这个问题具有相同性质的其他描述还包括:如何 ...

  4. SQL Server - 最佳实践 - 参数嗅探问题 转。

    文章来自:https://yq.aliyun.com/articles/61767 先说我的问题,最近某个存储过程,暂定名字:sp_a 总是执行超时,sp_a带有一个参数,暂定名为 para1 var ...

  5. 如何在SQL Server中生成和使用CRUD存储过程

    在本文中,请参阅如何在SQL Server中生成和使用CRUD存储过程. 大多数数据库系统基于缩写CRUD调用的最简单的4种数据操作操作进行操作. 此首字母缩写词代表CREATE,READ,UPDAT ...

  6. sql server 查询某个表被哪些存储过程调用

    sql server 查询某个表被哪些存储过程调用 select distinct object_name(id) from syscomments where id in (select id fr ...

  7. 刷新SQL Server所有视图、函数、存储过程

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  8. 刷新SQL Server所有视图、函数、存储过程 更多 sql 此脚本用于在删除或添加字段时刷新相关视图,并检查视图、函数、存储过程有效性。 [SQL]代码 --视图、存储过程、函数名称 DECLARE @NAME NVARCHAR(255); --局部游标 DECLARE @CUR CURSOR --自动修改未上状态为旷课 SET @CUR=CURSOR SCROLL DYNAMIC FO

    刷新SQL Server所有视图.函数.存储过程 更多   sql   此脚本用于在删除或添加字段时刷新相关视图,并检查视图.函数.存储过程有效性. [SQL]代码 --视图.存储过程.函数名称 DE ...

  9. 数据库表设计时一对一关系存在的必要性 数据库一对一、一对多、多对多设计 面试逻辑题3.31 sql server 查询某个表被哪些存储过程调用 DataTable根据字段去重 .Net Core Cors中间件解析 分析MySQL中哪些情况下数据库索引会失效

    数据库表设计时一对一关系存在的必要性 2017年07月24日 10:01:07 阅读数:694 在表设计过程中,我无意中觉得一对一关系觉得好没道理,直接放到一张表中不就可以了吗?真是说,网上信息什么都 ...

随机推荐

  1. day3-exercise

    # Author: 刘佳赐-Isabelle October 28,2018 """ 1. 文件a1.txt内容 序号 部门 人数 平均年龄 备注 1 python 30 ...

  2. Java学习笔记二十四:Java中的Object类

    Java中的Object类 一:什么是Object类: Object类是所有类的父类,相当于所有类的老祖宗,如果一个类没有使用extends关键字明确标识继承另外一个类,那么这个类默认继承Object ...

  3. C指针(4)——数据结构中指针的应用(非常重要)

    5-1动态内存分配,分配的是堆内存的空间 分配内存函数 (都集中在库函数 stdlib.h  中) void *malloc (unsigned int num_bytes); //指定分配内存空间大 ...

  4. PWA-缓存

    PWA-缓存 基础 PWA强大的离线能力就在于Service Worker拦截请求及提供缓存的能力,Service Worker的缓存能力比较强大,它能够赋予你更加精确控制缓存的能力.示例页面 < ...

  5. Java多线程一些基础知识

    最近复习了一些多线程方面的基础知识,做一下总结,多以自己的理解来文字叙述,如果有漏点或者理解错的地方,欢迎各位大佬多多指出: ps:线程分为用户线程和守护线程,当程序中的所有的用户线程都执行完了之后, ...

  6. 分布式专题(一)——Zookeeper简介

    什么是Zookeeper: CAP原理&Zookeeper数据的一致性: Zookeeper的集群架构: Zookeeper的客户端会话: Zookeeper的数据节点: Zookeeper的 ...

  7. PHP实现识别带emoji表情的字符串

    function have_special_char($str) { $length = mb_strlen($str); $array = []; for ($i=0; $i<$length; ...

  8. 北京Uber优步司机奖励政策(3月26日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  9. LeetCode:43. Multiply Strings (Medium)

    1. 原题链接 https://leetcode.com/problems/multiply-strings/description/ 2. 题目要求 给定两个String类型的正整数num1.num ...

  10. docker社区的geodata/gdal镜像dockerfile分析

    对应从事遥感与地理信息的同仁来说,gdal应该是所有工具中使用频度最高的库了,那么在docker中使用gdal时,面临的第一步就是构建gdal基础镜像,社区中引用最多的就是geodata提供的gdal ...