分页功能存储过程

ALTER PROCEDURE [dbo].[P_SplitPagesQuery]
@TablesName NVARCHAR(MAX),--表名或视图名(只能传单一表名)
@PK NVARCHAR(MAX)='',--主键(可以为空!)
@StrSort NVARCHAR(MAX)='',--排序字段(按照这个字段对查询结果进行排序),不能为空
@SortType INT =0,--排序方式,默认为0(升序),1为降序
@StrWhere NVARCHAR(MAX)='',--查询条件(即sql语句中的where后面部分)
@Fields NVARCHAR(MAX)='*',--读取字段(呈现出来的字段)
@PageCurrent INT =1,--当前页码,默认为1
@PageSize INT =10,--页面大小,默认为10
@PageCount INT OUTPUT,--总页数(按照页面大小一共分了多少页)
@RecordCount INT OUTPUT--查询结果的总条数
AS
/*
返回值说明:查询结果(表)
*/
DECLARE @SqlStr nvarchar(4000) IF @StrWhere IS NOT NULL AND @StrWhere != ''
BEGIN
SET @StrWhere = ' WHERE ' + @StrWhere + ' '
END
ELSE
BEGIN
SET @StrWhere = ''
END
BEGIN
IF @StrSort = ''
IF @PK IS NOT NULL AND @PK!=''
SET @StrSort = @PK
IF @PageCurrent < 1
SET @PageCurrent = 1
IF @SortType = 1 AND @StrSort!=''
SET @StrSort = @StrSort + ' DESC '
IF @SortType = 0 AND @StrSort!=''
SET @StrSort = @StrSort + ' ASC ' IF @PageCurrent = 1 --第一页提高性能
BEGIN
SET @SqlStr = 'SELECT TOP ' + str(@PageSize) +' '+@Fields+ ' FROM ' + @TablesName +
' AS tb ' + @StrWhere
IF @StrSort!=''
SET @SqlStr = @SqlStr + ' ORDER BY '+ @StrSort
END
ELSE
BEGIN
DECLARE @StartPos NVARCHAR(50)
DECLARE @EndPos NVARCHAR(50)
SET @StartPos = CONVERT(NVARCHAR(50),(@PageCurrent - 1) * @PageSize + 1)
SET @EndPos = CONVERT(NVARCHAR(50),@PageCurrent * @PageSize)
SET @SqlStr = ' SELECT '+@Fields+ '
FROM (SELECT ROW_NUMBER() OVER(ORDER BY '+@StrSort+') AS RowNum , tb.* '+'
FROM '+@TablesName+' AS tb '+@StrWhere+') AS D
WHERE RowNum BETWEEN '+@StartPos+' AND ' +@EndPos
IF @StrSort!=''
SET @SqlStr = @SqlStr + ' ORDER BY '+ @StrSort
END
END print @SqlStr
EXEC(@SqlStr) DECLARE @SqlCount NVARCHAR(4000) SET @SqlCount = 'SELECT @RecordCount=COUNT(*),@PageCount=CEILING((COUNT(*)+0.0)/'
+ CAST(@PageSize AS VARCHAR)+') FROM ' + @TablesName + @StrWhere
--输出参数赋值
EXEC SP_EXECUTESQL @SqlCount,N'@RecordCount INT OUTPUT,@PageCount INT OUTPUT',
@RecordCount OUTPUT,@PageCount OUTPUT

调用示例

EXEC @x =[dbo].[P_SplitPagesQuery] '表或视图','',@sOrderBy,@nOrderTpye,@sSqlString,'*',
@nPageNum,@nPageSize,@PageCount OUTPUT,@RecordCount OUTPUT

......

T-SQL分页功能存储过程的更多相关文章

  1. oracle带输入输出参数存储过程(包括sql分页功能)

    记录一下,免得以后忘记了又要到处去找. begin /*这里不能直接执行select语句但可以直接执行update.delete.insert语句*/ end里面不能接执行select语句,声明会话级 ...

  2. 【原创】SQL分页查询存储过程

    ------------------------------------- -----作者:张欣宇 -----时间:2013-06-28 -----简介:根据参数和条件分页查询 ----------- ...

  3. SQL 分页通用存储过程

    USE [DB] GO /****** Object: StoredProcedure [dbo].[SP_AspNetPager] Script Date: 10/23/2015 16:37:33 ...

  4. PL/SQL编程—分页功能(存储过程)

    SQL),bookname ),publish )); Table created SQL> SQL> create or replace procedure sp_add_book(bo ...

  5. SQL Server 的通用分页显示存储过程

    建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅适 ...

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

    [转]关于SQL分页存储过程的分析 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用 ...

  7. SQL Server 的通用分页显示存储过程(转载)

    http://database.51cto.com/art/200512/12923.htm 建立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是: ...

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

    建 立一个 Web 应用,分页浏览功能必不可少.这个问题是数据库处理中十分常见的问题.经典的数据分页方法是:ADO 纪录集分页法,也就是利用ADO自带的分页功能(利用游标)来实现分页.但这种分页方法仅 ...

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

    关于SQL分页的问题,网上找到的一些SQL其实不能真正做到通用,他们主要是以自增长ID做为前提的.但在实际使用中,很多表不是自增长的,而且主键也不止一个字段,其实我们稍做改进就可以达到通用.这里还增加 ...

随机推荐

  1. Django Rest Framework - Could not resolve URL for hyperlinked relationship using view name “user-detail”

    要把跟当前表相关的viewset定义出来 http://stackoverflow.com/questions/20550598/django-rest-framework-could-not-res ...

  2. python操作rabbitmq操作数据(不错)

    ##一.RabbitMQ 消息队列介绍 RabbitMQ也是消息队列,那RabbitMQ和之前python的Queue有什么区别么? py 消息队列: 线程 queue(同一进程下线程之间进行交互) ...

  3. openfaas 简单试用

    1. 安装 faas-cli  参考以前文章,或者使用官方的shell脚本   2. 简单例子 mkdir rong cd rong faas-cli new rong --lang python / ...

  4. c# HttpWebResponse 调用WebApi

    public static class WebApiCaller { public static string HttpPost(string url, string body) { try { // ...

  5. 多线程使用信号量sem_init,sem_wait,sem_post

    信号量的主要函数有: int sem_init(sem_t *sem,int pshared,unsigned int value); int sem_wait(sem_t *sem); int se ...

  6. java中绘制长方形,椭圆形,圆形的方法

    总结:方法,main函数的作用你还没搞清楚 //画一个矩形 import java.awt.*; import javax.swing.*; public class Test2 extends JF ...

  7. 事务之三:编程式事务、声明式事务(XML配置事务、注解实现事务)

    Spring2.0框架的事务处理有两大类: JdbcTemplate操作采用的是JDBC默认的AutoCommit模式,也就是说我们还无法保证数据操作的原子性(要么全部生效,要么全部无效),如: Jd ...

  8. Java中计算对象的大小

    一.计算对象大小的方法 Java中如何计算对象的大小呢,找到了4种方法: 1.java.lang.instrument.Instrumentation的getObjectSize方法: 2.BTrac ...

  9. 【OpenCV函数】轮廓提取;轮廓绘制;轮廓面积;外接矩形

    FindContours 在二值图像中寻找轮廓  int cvFindContours( CvArr* image, CvMemStorage* storage, CvSeq** first_cont ...

  10. resharper activate

    K03CHKJCFT-eyJsaWNlbnNlSWQiOiJLMDNDSEtKQ0ZUIiwibGljZW5zZWVOYW1lIjoibnNzIDEwMDEiLCJhc3NpZ25lZU5hbWUiO ...