分页存储过程,综合了NOT

存储过程|分页

分页存储过程,自己把“NOT_IN”和“SET ROWCOUNT”两种方式综合了一下。
“SET ROWCOUNT”算法不变,“NOT_IN”排序时加了主键字段,这样速度提升了很多而且结果是单向唯一的,但不是双向可逆的。“SET ROWCOUNT”没有速度问题,“NOT_IN”排序加了主键字段后在30W记录时对非索引字段、非聚合字段的排序翻一页不过3秒钟,还可以吧:P
----------------------
CREATE    PROCEDURE Paging_Custom
(
@Tables varchar(1000),
@PK varchar(100),
@Sort varchar(200) = NULL,
@isAscending bit=1,
@PageNumber int = 1,
@PageSize int = 10,
@Fields varchar(1000) = '*',
@Filter varchar(1000) = NULL,
@Group varchar(1000) = NULL)
AS

/*Default Sorting*/
IF @Sort IS NULL OR @Sort = ''
 SET @Sort = @PK

/*Find the @SORT type*/
DECLARE @strFilter varchar(1000)
DECLARE @strSimpleFilter varchar(1000)
DECLARE @strGroup varchar(1000)

DECLARE @SortTable varchar(100)
DECLARE @SortName varchar(100)
DECLARE @strPKColumn varchar(200)
DECLARE @strSortColumn varchar(200)
DECLARE @operator char(2)

/*Set filter & group variables.*/
IF @Filter IS NOT NULL AND @Filter != ''
 BEGIN
  SET @strFilter = ' WHERE ' + @Filter + ' '
  SET @strSimpleFilter = ' AND ' + @Filter + ' '
 END
ELSE
 BEGIN
  SET @strSimpleFilter = ' '
  SET @strFilter = ' '
 END
IF @Group IS NOT NULL AND @Group != ''
 SET @strGroup = ' GROUP BY ' + @Group + ' '
ELSE
begin
 SET @strGroup = ' '
end

/*count*/
exec('select count(*) from ' +@Tables+' '+ @strFilter)

/*Set sorting variables.*/
SET @strSortColumn =@Sort

/*operator and asc_desc*/
declare @strAsc_Des varchar(10)
IF @isAscending = 0
 BEGIN
  
  SET @operator = '<='
  SET @strAsc_Des = ' Desc '
 END
ELSE
 BEGIN
  SET @operator = '>='
  SET @strAsc_Des = ' ASC '
 END
IF CHARINDEX('.', @PK) > 0
 BEGIN
  SET @strPKColumn = SUBSTRING(@PK, 0, CHARINDEX('.',@PK))  
 END
ELSE
 BEGIN
  SET @strPKColumn = @PK  
 END
IF CHARINDEX('.', @strSortColumn) > 0
 BEGIN
  SET @SortTable = SUBSTRING(@strSortColumn, 0, CHARINDEX('.',@strSortColumn))
  SET @SortName = SUBSTRING(@strSortColumn, CHARINDEX('.',@strSortColumn) + 1, LEN(@strSortColumn))
 END
ELSE
 BEGIN
  SET @SortTable = @Tables
  SET @SortName = @strSortColumn
 END

/*Handler complex table*/
--Be join table,so get the left table
IF CHARINDEX(' join ',@Tables) > 0
BEGIN
SET @SortTable=SUBSTRING(ltrim(@Tables),0,CHARINDEX(' ',@Tables))
SET @strSortColumn = @SortTable+'.'+@SortName
END

/*Check the sortColumn if be Unique*/
DECLARE @tempName varchar(100)
IF @SortName <> @strPKColumn
begin
SELECT @tempName=b.name
FROM sysobjects a INNER JOIN
      sysobjects b ON a.id = b.parent_obj
    INNER JOIN sysindexes c ON b.name = c.name INNER JOIN
      sysindexkeys d ON c.id = d.id AND c.indid = d.indid INNER JOIN
      syscolumns e ON d.id = e.id AND d.colid = e.colid
WHERE (b.xtype = 'UQ') AND (a.name = @SortTable) AND (e.name = @SortName)

IF @tempName IS NULL GOTO:Paging_Not_In
end

DECLARE @type varchar(100)
DECLARE @prec int

SELECT @type=t.name, @prec=c.prec
FROM sysobjects o
JOIN syscolumns c on o.id=c.id
JOIN systypes t on c.xusertype=t.xusertype
WHERE o.name = @SortTable AND c.name = @SortName

/*The left table doesn't contain sortcolumn */
--IF  @type is null or @type=''  Goto:Paging_Not_In

IF CHARINDEX('char', @type) > 0
   SET @type = @type + '(' + CAST(@prec AS varchar) + ')'

DECLARE @strPageSize varchar(50)
DECLARE @strStartRow varchar(50)

/*Default Page Number*/
IF @PageNumber < 1
 SET @PageNumber = 1

/*Set paging variables.*/
SET @strPageSize = CAST(@PageSize AS varchar(50))
SET @strStartRow = CAST(((@PageNumber - 1)*@PageSize + 1) AS varchar(50))
 
/*Execute dynamic query*/ 

EXEC( 'DECLARE @SortColumn ' + @type + '
SET ROWCOUNT ' + @strStartRow +
 'SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup +
 ' ORDER BY ' + @Sort + @strAsc_Des+'SET ROWCOUNT ' + @strPageSize +
 'SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + ' @SortColumn ' +
 @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + @strAsc_Des
)
return

Paging_Not_In:
--DECLARE @strPageSize varchar(50)
--SET @strPageSize = CAST(@PageSize AS varchar(50))
declare @strTotalNum int
SET @strTotalNum = (@PageNumber - 1)*@PageSize
--第一页
--Declare @strSQL varchar(8000)
IF  @strTotalNum = 0
begin
exec('select top '+@PageSize+' '+@Fields+' from '+@Tables+' '+@strFilter+ @strGroup + ' ORDER BY ' + @Sort + @strAsc_Des)  
end
else
begin
 exec('select top '+@PageSize+' '+@Fields+' from '+@Tables+'  where '
+@PK+' not in(select top '
+@strTotalNum+' '+@PK+' from '+@Tables+' '+@strFilter+ @strGroup +
 ' ORDER BY ' + @Sort + @strAsc_Des
+') '+@strSimpleFilter+ @strGroup + ' ORDER BY ' + @Sort + @strAsc_Des)
end

GO

时间: 2024-10-29 10:19:58

分页存储过程,综合了NOT的相关文章

公用ms sql 分页存储过程

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 在编写分页存储过程前我们先为数据库创建一个测试表,这个测试表明叫做order,当中有3个字段,分别是or_id,orName,dateSta;下面创建表脚本: CREATE TABLE [dbo].[Orders](     [or_id] [int] IDENTITY(1,1) NOT NULL,     [orName] [nvarcha

分页存储过程(用存储过程实现数据库的分页代码)

复制代码 代码如下:--******************************************************* --* 分页存储过程 * --* 撒哈拉大森林 * --* 2010-6-28 * --******************************************************* if exists(select * from sysobjects where type='P' and name=N'P_Paging') drop proce

SQLSERVER Pager store procedure分页存储过程

复制代码 代码如下:SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE PROCEDURE [dbo].[Pagination] @Page int = 1, -- 当前页码 @PageSize int = 10, -- 每页记录条数(页面大小) @Table nvarchar(500), -- 表名或视图名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab @Field nvarchar

分页存储过程(二)在sqlserver中返回更加准确的分页结果

在我的使用SQL Server2005的新函数构造分页存储过程中,我提到了使用ROW_NUMBER()函数来代替top实现分页存储过程. 但是时间长了,又发现了新问题,就是主子表的分页查询.例如:订单表和订单明细表,要求是查询订单,第二页,每页10条 复制代码 代码如下: --使用row_unmber()实现分页 --本来我们想要的结果是10条订单,结果却不是10条订单,而是10条明细 --其实是针对的子表进行分页了,订单并不是要显示的个数,出来的个数是明细的个数 --就是因为主表和子表联合查询

asp.net中常用到的SQL分页存储过程

asp.net中常用到的SQL分页存储过程 以下是引用片段:create PROCEDURE [dbo].[myPage] @tblName varchar(255), -- 表名 @fldName varchar(255), -- 排序的字段名,一般为唯一标识 @strGetFields varchar(1000) = ' * ', -- 需要返回的列  @PageSize int = 10, -- 每页有多少条记录 @PageIndex int = 1, -- 第几页 @Count int 

一个简单的oracle分页存储过程的实现和调用

oracle|存储过程|分页|oracle|存储过程|分页 在看了众多的分页存储过程以后发现都是针对sqlserver的,而没有oracle的,因此想写一个关于oracle的存储过程,因为我用到的数据库是oracle.---------------------------------------------------------------------------------------------------------------------------------------------

数据库分页存储过程

存储过程|分页|数据|数据库 /*数据库分页存储过程---equn.net参数说明:?tablename为搜索表名?where为搜索表名,要显示所有记录请设为"1=1"?orderby为搜索结果排序,如order by id desc?curpage当前页码?page_record每页记录条数结果:?返回表tablename中满足条件where的第curpage页的page_record条记录,结果按orderby排序*/CREATE PROCEDURE Xp_Page(@tablen

分页存储过程

存储过程|分页 测试了下,1200000条数据,查询不到1分钟,而使用传统的查询方法,要好几分钟 /*分页存储过程Descript:分页存储过程Author:Blue.DreamDate:2004-8-18 21:01*/CREATE  PROCEDURE ListPage(@tblName  nvarchar(200),           ----要显示的表或多个表的连接@fldName  nvarchar(200) = '*',          ----要显示的字段列表@pageSize

简单谈基于SQL SERVER 分页存储过程的演进

server|存储过程|分页 简单谈基于SQL SERVER 分页存储过程的演进 作者:郑佐日期:2006-9-30 针对数据库数据在UI界面上的分页是老生常谈的问题了,网上很容易找到各种"通用存储过程"代码,而且有些还定制查询条件,看上去使用很方便.笔者打算通过本文也来简单谈一下基于SQL SERVER 2000的分页存储过程,同时谈谈SQL SERVER 2005下分页存储过程的演进. 在进行基于UI显示的数据分页时,常见的数据提取方式主要有两种.第一种是从数据库提取所有数据然后在