T-SQL分页功能存储过程

分页功能存储过程

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

......

时间: 2024-07-31 14:56:30

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

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

1 ------------------------------------- 2 -----作者:张欣宇 3 -----时间:2013-06-28 4 -----简介:根据参数和条件分页查询 5 ------------------------------------- 6 Create proc [dbo].[Up_PagingQueryByParameter] 7 ( 8 ----- 表名或能查询到结果的SQL语句{SQL语句左右必须有括号例:(select * from tbl1)} 9

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 , -- 页码

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

SQL> create table t_book(bookid varchar2(3),bookname varchar2(50),publish varchar2(50)); Table created SQL> SQL> create or replace procedure sp_add_book(bookid in varchar2, bookname in varchar2,publish in varchar2) is 2 begin 3 insert into t_book

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

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

创建有输出参数的存储过程并在c#中实现DataGridView分页功能

不足之处,欢迎指正! 创建有输出参数的存储过程 if exists(select * from sysobjects where name='usp_getPage1') drop procedure usp_getPage1 go create procedure usp_getPage1--存储过程名称 @count int output,--输出参数 @countIndex int=1,--参数带默认值 @countPage int=5--参数带默认值 as --一个sql语句.ROW_N

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

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

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

建立一个 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