您的位置:首页 > 其它

分页存储过程

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: