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,1,'','id'
EXEC dbo.page 'RGraph','*','id',3,2,0,1,'','id'
EXEC dbo.page 'RGraph','*','id',3,3,0,1,'','id'
EXEC dbo.page 'RGraph','*','id',3,4,0,1,'','id'
EXEC dbo.page 'RGraph','*','id',3,5,0,1,'','id'
EXEC dbo.page 'RGraph','*','id',3,6,1,1,'','id'
结果如图: