Create PROCEDURE [dbo].[USP_Execute_Page]
(
@Fields nvarchar(max) = 'T.*' --字段
,@TableName nvarchar(200) --表名
,@Joins nvarchar(max) = '' --连接表及规则
,@Wheres nvarchar(max) = '' --不用 Where 关键字
,@Orders nvarchar(600) = '' --不同 Order By 关键字
,@PageSize int = 20 --页宽
,@PageIndex int = 0 --1.表示第一页 | 0.表示不分页
,@RowCount int output --记录总数,只在当前页小于1时产生
)
AS
SET NOCOUNT ON
-- 设置where的默认值
if LTRIM(RTRIM(@Wheres)) = ''
begin set @Wheres = '' end
else
begin set @Wheres = ' Where ' + @Wheres end
--设置Order By的默认值
if LTRIM(RTRIM(@Orders)) = ''
begin set @Orders = '' end
else
begin set @Orders = ' Order By ' + @Orders end
----------------- 定义变量 -----------------//
declare @strsql nvarchar(max)
declare @iSum int
declare @defaultsql nvarchar(max)
set @defaultsql = 'With S1 AS (Select '+ @Fields + ' From ' + @TableName + ' AS T ' + @Joins +') ';
-- 计算记录总数 --
IF @PageIndex = 1 BEGIN
set @strsql = @defaultsql + 'Select @iSum = count(0) From S1 ' + @Wheres;
exec sp_executesql @strsql
,@params = N'@iSum int output'
,@iSum = @iSum OUTPUT ;
set @RowCount = @iSum;
END
--------------- 不执行分页查询 ---------------//
IF @pageIndex < 1
BEGIN
SET @strsql = @defaultsql + 'Select Top ' + Convert(varchar(10),@PageSize) + ' * From S1 ' + @Wheres + ' ' + @Orders;
EXEC(@strsql) ;
END
--------------- 执行分页查询 -----------------//ELSE BEGIN DECLARE @min int,@max int; SET @min = (@pageIndex-1) * @pageSize; SET @max = (@pageIndex) * @PageSize; SET @strsql = @defaultsql + ', S2 AS( Select Row_Number() Over(' +@Orders+ ') AS RowId,* From S1 ' +@Wheres+ ' ) Select * From S2 Where RowId > ' + CONVERT(varchar(10),@min) + ' AND RowId <= ' + CONVERT(varchar(10),@max) EXEC (@strsql) END
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。