SqlServer存储过程分页代码(支持亿万庞大数据量)
发布时间:2020-12-12 13:47:44 所属栏目:MsSql教程 来源:网络整理
导读:Sql语句如下 USE [ Test ]go SET ansi_nulls ON go SET quoted_identifier ON go ALTER PROCEDURE [dbo].[ Page ] @tblName VARCHAR ( 255 ),-- 表名 @strGetFields VARCHAR ( 1000 ) = '*' ,-- 需要返回的列 @fldName VARCHAR ( 255 )= 'id' ,-- 排序的字段
Sql语句如下USE [Test]
go
SET ansi_nulls ON
go
SET quoted_identifier ON
go
ALTER PROCEDURE [dbo].[Page] @tblName VARCHAR(255),-- 表名
@strGetFields VARCHAR(1000) = '*',-- 需要返回的列
@fldName VARCHAR(255)='id',-- 排序的字段名
@PageSize INT = 10,-- 页尺寸
@PageIndex INT = 1,-- 页码
@doCount BIT = 0,-- 返回记录总数,非 0 值则返回
@OrderType BIT = 0,-- 设置排序类型,非 0 值则降序 0:asc 1:desc
@strWhere VARCHAR(1500) = '',-- 查询条件 (注意: 不要加 where)
@ID NVARCHAR(50)='id'--主表的列。。最好是主键
AS
DECLARE @strSQL VARCHAR(5000) -- 主语句
DECLARE @strTmp VARCHAR(110) -- 临时变量
DECLARE @strOrder VARCHAR(400) -- 排序类
IF @doCount != 0
BEGIN
IF @strWhere != ''
SET @strSQL = 'select count(*) as Total from ' + @tblName + ' where ' + @strWhere
ELSE
SET @strSQL = 'select count(*) as Total from ' + @tblName + ''
END
--以上代码的意思是如果@doCount传递过来的不是0,就执行总数统计。以下的所有代码都是@doCount为0的情况
ELSE
BEGIN
IF @OrderType != 0
BEGIN
SET @strTmp = '<(select min'
SET @strOrder = ' order by ' + @fldName + ' desc' --如果@OrderType不是0,就执行降序,这句很重要!
END
ELSE
BEGIN
SET @strTmp = '>(select max'
SET @strOrder = ' order by ' + @fldName + ' asc'
END
IF @PageIndex = 1
BEGIN
IF @strWhere != ''
SET @strSQL = 'select top ' + Str(@PageSize) + ' '
+ @strGetFields + ' from ' + @tblName +
' where '
+ @strWhere + ' ' + @strOrder
ELSE
SET @strSQL = 'select top ' + Str(@PageSize) + ' '
+ @strGetFields + ' from ' + @tblName + ' '
+ @strOrder
--如果是第一页就执行以上代码,这样会加快执行速度
END
ELSE
BEGIN
--以下代码赋予了@strSQL以真正执行的SQL代码
SET @strSQL = 'select top ' + Str(@PageSize) + ' '
+ @strGetFields + ' from ' + @tblName + ' where '
+ @fldName + ' ' + @strTmp + '( ' + @ID
+ ' ) from (select top '
+ Str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + @strOrder
+ ') as tblTmp)' + @strOrder
IF @strWhere != ''
SET @strSQL = 'select top ' + Str(@PageSize) + ' '
+ @strGetFields + ' from ' + @tblName +
' where '
+ @fldName + ' ' + @strTmp + '(' + @ID
+ ') from (select top '
+ Str((@PageIndex-1)*@PageSize) + ' '
+ @fldName + ' from ' + @tblName + ' where '
+ @strWhere + ' ' + @strOrder +
') as tblTmp) and '
+ @strWhere + ' ' + @strOrder
END
END
PRINT ( @strSQL )
EXEC (@strSQL)
执行存储过程如下:EXEC dbo.page 'RGraph','*','id',3,1,0,'','id'
EXEC dbo.page 'RGraph',2,4,5,'id'
--返回总数量
EXEC dbo.page 'RGraph',6,'id'
结果如图:(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |