MS SQLSERVER通用存储过程分页
最近在面试的时候,遇到个奇葩的秃顶老头面试官。
问:写过存储过程分页吗?
答:没写过,但是我知道分页存储的原理,我自己也写过,只是在工作中没写过。
问:那你这么多年工作中就没写过吗?
答:的确没写过,因为项目数据量都特别小。
然后,这奇葩就起身就要走人了,连个招呼都没有。想我面试了这么多公司,这种奇葩面试官,还是头回见到,一点职业素质,礼貌都木有。气死我了!
明天要去入职新公司了,今天闲来无事,试着写了写这个存储过程分页。只在SQLSERVER2008上测试过,不过我想,2000以上版本应该都会支持的吧。
废话到此,上代码。
if (object_id('Proc_Paging', 'P') is not null)
drop proc Proc_Paging
go
create procedure Proc_Paging
(
@TableName varchar(20),--表名
@PageIndex int=0,--起始页索引,从0开始
@PageSize varchar(1000)='10',--默认每页显示的数量,默认每页显示10条记录
@Params varchar(100)='*',--分页结果中显示的字段,默认显示全部的字段
@ID varchar(20)='ID',--数据编号排序字段,默认为ID
@OrderByID varchar(20)='asc',--数据编号排序方式,默认为正序排序
@StrWhereSource varchar(100),--分页数据的查询条件,必须以where开头
@StrWherePaging varchar(100),--已经分页的数据的查询条件,不能以where开头
@OrderBy varchar(100)='ID asc'--数据排序方式
)
as
declare @Sql varchar(8000),@PageStartNum varchar(1000),@PageEndNum varchar(1000),@Sql2 varchar(1000),@Sql3 varchar(1000)
--1.获取指定页数据
set @PageStartNum=(@PageIndex)*(@PageSize)--起始数据编号
set @PageEndNum=(@PageIndex+1)*(@PageSize)--截止数据编号
set @Sql='select row_number() over(order by '+@ID+' '+@OrderByID+') Num,'+@Params+' '+
'into #temp '+
'from '+@TableName+' '+@StrWhereSource+''+
'select * from #temp where Num between '+
''+(@PageStartNum)+' and '+(@PageEndNum)+' '+@StrWherePaging+' order by '+@OrderBy+' '
exec(@Sql)
--print @Sql
--2.获取总记录数
set @Sql2='select count(1) from '+@TableName+''
exec(@Sql2)
--print @Sql2
--3.获取分页总数
set @Sql3='select ceiling(count(1)*1.0/('+@PageSize+')) from '+@TableName+''
exec(@Sql3)
--print @Sql3
go
--测试代码
exec Proc_Paging 'Customers',2,10,'CustomerID,CompanyName,Address,City,PostalCode','CustomerID','asc','where PostalCode>''1000'' ','and Num>1 ','Num asc'
go
下面是运行结果截图。
执行结果:

生成的sql语句:

大神,勿喷;菜鸟,轻拍。谢谢!
MS SQLSERVER通用存储过程分页的更多相关文章
- 改良版的SQL Service 通用存储过程分页
上次写了通用存储过程.感觉还是有很大的BUG.就是条件不能参数画化.这个BUG可以说是致命的.但是我一直想在用什么方法能解决这个东西.其实我只是想写少量的代码来做更多的事情.我想能不能传集合给存储过程 ...
- SqlServer通用存储过程
1.增删改—通用存储过程 --增删改 存储过程create proc Infos_InsertUpdateDelete( @Id int, @Name varchar(50), @DataTable_ ...
- 一个通用的分页存储过程实现-SqlServer(附上sql源码,一键执行即刻搭建运行环境)
使用前提 查询表必须有ID字段,且该字段不能重复,建议为自增主键 背景 如果使用ADO.NET进行开发,在查询分页数据的时候一般都是使用分页存储过程来实现的,本文提供一种通用的分页存储过程,只需要传入 ...
- SQL存储过程分页(通用的拼接SQL语句思路实现)
多表通用的SQL存储过程分页 案例一: USE [Community] GO /****** Object: StoredProcedure [dbo].[Common_PageList] Scrip ...
- 如此高效通用的分页存储过程是带有sql注入漏洞的
原文:如此高效通用的分页存储过程是带有sql注入漏洞的 在google中搜索“分页存储过程”会出来好多结果,是大家常用的分页存储过程,今天我却要说它是有漏洞的,而且漏洞无法通过修改存储过程进行补救,如 ...
- 【原创】10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程)
有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc4+Dapper+Dapper扩展+Sqlserver 目前主要实现 ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- 分享一个通用的分页SQL
又很久没写博客,今天记录一个SQLserver通用分页存储过程(适用于SqlServer2000及以上版本) 1.支持连表 2.支持条件查询 USE [MYDB] GO /****** Object: ...
- asp.net利用存储过程分页代码
-最通用的分页存储过程 -- 获取指定页的数据 CREATE PROCEDURE Pagination ), -- 表名 ) = '*', -- 需要返回的列 )='', -- 排序的字段名 , -- ...
随机推荐
- python模块目录文件后续
1,新增PythonModule加载path Ruiy tip(关于python list[]数据库类型特殊你懂的!append(""),extend([""] ...
- 甲骨文推动Java进军“物联网”
该公司希望在嵌入式设备开发项目上Java可以取代C 随着周二宣布对嵌入式的Java版本进行升级,甲骨文希望扩展该平台到新一代连接设备,又名物联网.甲骨文还希望,Java可以在一些嵌入式开发项目 ...
- hdu 5533 Dancing Stars on Me(数学,水)
Problem Description The sky was brushed clean by the wind and the stars were cold in a black sky. Wh ...
- Android UI目录
Android UI目录 序:最近一直想进阶android应用开发,虽然对一些相关的android知识都大体熟悉,但是自己的android知识体系,经不起推敲.经不起高手的垂问.经过几个月的努力学习, ...
- android _scrollview嵌套listview出现高度显示不全解决方案
只要在工具类里写上这一段代码:/** * scrollview嵌套listview显示不全解决 * @param listView */ public static void setListViewH ...
- 热烈祝贺Polymer中文组织站点上线
欢迎来到前端世界的明天 由于官网被墙, 所以 http://docs.polymerchina.org/ 其实是一件很有意义的事. 组件化和重用,一直是编程界几十年来前进的方向和目标,随着时间的推移和 ...
- Web--->>>Cookie与Session
1.cookie 1.cookie是存在客户端(浏览器)的进程内存中和客户端所在的机器硬盘上 2.cookie只能能够存储少量文本,大概4K大小 3.cookie是不能在不同浏览器之间共享 3.创建c ...
- oracle 日期to_char转换24小时制12小时制
1>以12小时制显示 SQL>select to_char(sysdate,'YYYY-MM-DD HH12:MI:SS AM')from dual; TO_CHAR(SYSDATE,'Y ...
- html css float left与 float right的使用说明
点评: CSS中很多时候会用到浮动来布局,也就是经常见到的float:left或者float:right,简单点来说,前者是左浮动(往左侧向前边的非浮动元素飘,全是飘得元素的话,就按照流式来浮动从左到 ...
- canvas总结:线段宽度与像素边界
在canvas中,我们经常需要绘制线段,主要使用moveTo和lineTo两个方法,moveTo移动至线段起始点,lineTo将线段绘制至终点.同时,绘制线段时可以指定线段的宽度,使用lineWidt ...