USE [test]
GO
/****** 对象: StoredProcedure [dbo].[PublicSplitPage_sp] 脚本日期: 06/29/2012 16:00:35 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[PublicSplitPage_sp]
@TableName varchar(8000), --表名
@SqlStr varchar(8000)=null, --查询语句
@Condition varchar(8000), --查询条件
@PageIndex int, --页所引,从0开始
@PageSize int, --分页大小
@orderDESC varchar(100), --倒排序字段,支持多个字段
@orderASC varchar(100), --顺排序字段,支持多个,字段先后顺序与倒排序一致
@PKField varchar(50)='*', --索引字段
@SearField varchar(1000), --查询字段
@RecordCount int out --返回记录数
AS
if @SqlStr is not null and @SqlStr<>''
begin
exec(@SqlStr)
select @RecordCount=@@ROWCOUNT
end
else
begin
declare @iTop int,@tmpTop int
declare @vSQL nvarchar(2000)
set @vSQL = N'select @count=Count('+@PKField+') from ' + @TableName + ' where ' + @Condition
exec sp_ExecuteSQL @vSQL, N'@count int output', @RecordCount output
set @iTop=@PageSize
set @tmpTop=@RecordCount-(@PageSize*(@PageIndex-1))
if @RecordCount<@PageSize*@PageIndex
begin
set @iTop=@tmpTop
end
DECLARE @sqlStr1 varchar(8000)
IF @PageIndex = 1
SET @sqlStr1 = 'SELECT TOP ' + STR(@PageSize) + ' '+@SearField+' FROM '+@TableName+' WHERE '+@Condition+' ORDER BY '+@orderDESC
ELSE if @PageIndex<@RecordCount/(2*@PageSize) -- 此处可以加优化,从中间页往两边
SET @sqlStr1 = 'SELECT TOP ' + STR(@PageSize) + ' * FROM (select top ' + STR(@PageSize) + ' * from (SELECT TOP '
+ STR(@PageSize*@PageIndex) + ' '+@SearField+' FROM '+@TableName
+' WHERE '+@Condition+' ORDER BY '+@orderDESC+') TempTable order by '+@orderASC+') A ORDER BY '+@orderDESC
else
SET @sqlStr1 = 'SELECT TOP ' + STR(@iTop) + ' * FROM (SELECT TOP '
+ STR(@tmpTop) + ' '+@SearField+' FROM '+@TableName
+' WHERE '+@Condition+' ORDER BY '+@orderASC+') TempTable ORDER BY '+@orderDESC
print(@sqlStr1)
EXEC(@sqlStr1)
end