分页存储过程

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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值