写个存储过程,做一下千万数据库的数据分页问题

此存储过程在集于SQL Server 2005 版本或以上版本,如果前台页设置 每页显示15,此存储过程返回的结果集只有15条数据。

此存储过程还集成 如果查询出来的数据量超过预设数据量,则返回0条数据。

此存储过程在集于SQL Server 2005 版本或以上版本,如果前台页设置 每页显示15,此存储过程返回的结果集只有15条数据。

EXEC  PROC_Page 'T1.* ',' FROM TABLE T1 ',' T1.ID DESC ',15,2,10000


CREATE PROC [dbo].[PROC_Page](
	@SQLCOLUMN VARCHAR(8000)='',	--SELECT 内容
	@SQLFROM VARCHAR(8000)='',		--SELECT 之外内容
	@SQLORDER VARCHAR(8000)='',		--排序
	@PageSize INT=0,			--每页多少条
	@PageNum INT=1,				--当前页数
	@MaxCount INT=10000			--显示上线
)
AS
BEGIN
SET NOCOUNT ON;

	Declare @CountSql NVARCHAR(4000),@COUNT INT,@MaxPage Numeric(18,0),@SQL VARCHAR(8000)
	SET @CountSql=N'SELECT @COUNT=COUNT(1) FROM (SELECT TOP ' + 
		CAST(@MaxCount AS VARCHAR) + ' 1 AS NUM ' + @SQLFROM + ') TZ '
	EXEC SP_EXECUTESQL @CountSql,N'@COUNT INT OUTPUT',@COUNT OUTPUT

	IF(@COUNT = @MaxCount)
	BEGIN
		SELECT '-1' AS MaxCount,@PageSize AS PageSize, '0' AS MaxPage
		SET @SQL = 'SELECT TOP 0 ' + @SQLCOLUMN +' '+ @SQLFROM
		EXEC (@SQL)
		RETURN;
	END
	
	SELECT @MaxPage = (CASE WHEN ISNULL(@COUNT,0)=0 OR @PageSize=0  THEN 0 ELSE 
		CEILING(CAST(@COUNT AS NUMERIC(18,6))/CAST(@PageSize AS NUMERIC(18,6)))END)	

	SELECT @COUNT AS MaxCount,@PageSize AS PageSize, @MaxPage AS MaxPage
	
	If @PageNum > @MaxPage
		Set @PageNum = @MaxPage
	DECLARE @BNUM INT,@ENUM INT
	SELECT @BNUM = (@PageNum-1)*@PageSize+1,@ENUM = @PageNum * @PageSize
	
	SET @SQL = 'SELECT * FROM( SELECT ROW_NUMBER() OVER(ORDER BY ' + @SQLORDER + ') AS ROWNUM,' +
		@SQLCOLUMN +' '+ @SQLFROM + ' ) A WHERE ROWNUM>=' + 
		CAST(@BNUM AS VARCHAR) + ' AND ROWNUM <=' + CAST(@ENUM AS VARCHAR)
	EXEC (@SQL)
	
SET NOCOUNT OFF;
END

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值