分页存储过程
2008-07-01 18:51
190 查看
CREATE DATABASE [PagingTest] ON (NAME = N'PagingTest_Data', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL/data/PagingTest_Data.MDF' , SIZE = 8, FILEGROWTH = 10%) LOG ON (NAME = N'PagingTest_Log', FILENAME = N'C:/Program Files/Microsoft SQL Server/MSSQL/data/PagingTest_Log.LDF' , SIZE = 1, FILEGROWTH = 10%) COLLATE Chinese_PRC_CI_AS GO use PagingTest if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[InsertLargeTableData]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[InsertLargeTableData] GO if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[LargeTable]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) drop table [dbo].[LargeTable] GO CREATE TABLE [dbo].[LargeTable] ( [PK] [uniqueidentifier] NOT NULL , [Indexed] [varchar] (150) NOT NULL , [NonIndexed] [varchar] (150) NOT NULL ) ON [PRIMARY] GO ALTER TABLE [dbo].[LargeTable] WITH NOCHECK ADD CONSTRAINT [PK_LargeTable] PRIMARY KEY CLUSTERED ( [PK] ) ON [PRIMARY] GO CREATE INDEX [IX_LargeTable] ON [dbo].[LargeTable]([Indexed]) ON [PRIMARY] GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS OFF GO CREATE PROCEDURE InsertLargeTableData ( @NumberOfRows bigint ) AS SET NOCOUNT ON DECLARE @cnt bigint SET @cnt = 0 WHILE @cnt < @NumberOfRows BEGIN INSERT INTO LargeTable SELECT newid(), CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)), CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)) + CAST(newid() AS VARCHAR(36)) SET @cnt = @cnt + 1 END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO --*********************************************************************************************************************** if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Paging_RowCount]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[Paging_RowCount] GO SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO --------------------------------------------------------------- -- 分页存储过程(使用RowCount) --edit by SiBen -- summary: -- 获取表或表集合的分页数据 -- 当多表连接时,sort列必须指定表名 --------------------------------------------------------------- CREATE PROCEDURE Paging_RowCount ( @Tables varchar(1000), @PK varchar(100), @Sort varchar(200) = NULL, @PageNumber int = 1, @PageSize int = 10, @Fields varchar(1000) = '*', @Filter varchar(1000) = NULL, @Group varchar(1000) = NULL, @RecordCount int = 0 output ) AS /*Default Sorting*/ IF @Sort IS NULL OR @Sort = '' SET @Sort = @PK /*Find the @PK type*/ DECLARE @SortTable varchar(100) DECLARE @SortName varchar(100) DECLARE @PKTable varchar(100) DECLARE @PKName varchar(100) DECLARE @strSortColumn varchar(200) DECLARE @operator char(2) DECLARE @type varchar(100) DECLARE @prec int /*Set sorting variables.*/ IF CHARINDEX('DESC',@Sort)>0 BEGIN SET @strSortColumn = REPLACE(@Sort, 'DESC', '') SET @operator = '<' END ELSE BEGIN IF CHARINDEX('ASC', @Sort) > 0 SET @strSortColumn = REPLACE(@Sort, 'ASC', '') ELSE SET @strSortColumn = @Sort SET @operator = '>' END /* Set PK,Sort name */ 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 IF CHARINDEX('.', @PK) > 0 BEGIN SET @PKTable = SUBSTRING(@PK, 0, CHARINDEX('.',@PK)) SET @PKName = SUBSTRING(@PK, CHARINDEX('.',@PK) + 1, LEN(@PK)) END ELSE BEGIN SET @PKTable = @Tables SET @PKName = @PK END 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 IF CHARINDEX('char', @type) > 0 SET @type = @type + '(' + CAST(@prec AS varchar) + ')' DECLARE @strPageSize varchar(50) DECLARE @strStartRow varchar(50) DECLARE @strFilter varchar(1000) DECLARE @strSimpleFilter varchar(1000) DECLARE @strGroup varchar(1000) /*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)) /*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 SET @strGroup = '' /*Get rows count.*/ DECLARE @str_Count_SQL nvarchar(500) SET @str_Count_SQL= 'SELECT @TotalCount=count(*) FROM ' + @Tables + @strFilter EXEC sp_executesql @str_Count_SQL,N'@TotalCount int=0 output',@RecordCount output /*Execute dynamic query*/ IF @PKTable = @SortTable and @PKName = @SortName BEGIN EXEC( ' DECLARE @SortColumn ' + @type + ' SET ROWCOUNT ' + @strStartRow + ' SELECT @SortColumn=' + @strSortColumn + ' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' SET ROWCOUNT ' + @strPageSize + ' SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE ' + @strSortColumn + @operator + '= @SortColumn ' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ' ' ) END ELSE BEGIN /* Get PK Type */ DECLARE @pktype varchar(100) DECLARE @pkprec int SELECT @pktype=t.name, @pkprec=c.prec FROM sysobjects o JOIN syscolumns c on o.id=c.id JOIN systypes t on c.xusertype=t.xusertype WHERE o.name = @PKTable AND c.name = @PKName IF CHARINDEX('char', @pktype) > 0 SET @pktype = @pktype + '(' + CAST(@pkprec AS varchar) + ')' /*Execute dynamic query*/ EXEC( ' DECLARE @SortColumn ' + @type + ' DECLARE @SortNullValue ' + @type + ' DECLARE @PKStartValue ' + @pktype + ' SET @SortNullValue=CAST('''' as '+ @type +') SET ROWCOUNT ' + @strStartRow + ' SELECT @SortColumn= isNull(' + @strSortColumn + ',@SortNullValue), @PKStartValue = '+ @PK +' FROM ' + @Tables + @strFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ','+ @PK +' Desc SET ROWCOUNT ' + @strPageSize + ' SELECT ' + @Fields + ' FROM ' + @Tables + ' WHERE (isNull(' + @strSortColumn+',@SortNullValue)' + @operator + ' @SortColumn or (isNull(' + @strSortColumn+',@SortNullValue)=@SortColumn and '+ @PK +'<=@PKStartValue))' + @strSimpleFilter + ' ' + @strGroup + ' ORDER BY ' + @Sort + ','+ @PK +' Desc ' ) END GO SET QUOTED_IDENTIFIER OFF GO SET ANSI_NULLS ON GO exec InsertLargeTableData 1000
相关文章推荐
- SQL Server 的通用分页显示存储过程
- 三种SQL分页查询的存储过程代码
- SQL Server 分页存储过程
- 两种分页存储过程
- 分页存储过程
- 存储过程分页(sql2005)
- SQL Server的通用分页存储过程 未使用游标,速度更快!
- 一个通用MSSQL海量数据分页存储过程
- 分页存储过程整理-整理
- asp.net 安全、实用、简单的大容量存储过程分页第1/2页
- [转]SQL存储过程分页
- 整理:分页存储过程整理
- 存储过程实现分页
- 一个通用的分页存储过程(原创)
- SQL Server两种分页的存储过程使用介绍
- SQL Server 存储过程的分页方案比拼[转载自李洪根blogs]
- 通用分页存储过程注入问题解决方案:不用存储过程,通用分页查询方法
- Repeater应用分页存储过程
- 常用的分页存储过程