SQL Server 分页存储过程

USE [ReportServerTempDB]
GO
CREATE PROCEDURE [dbo].[SeachTablePage]
(
	@TableName VARCHAR(200),	-- 表名
	@Fileds VARCHAR(500),		-- 查询的字段
	@OrderFiled VARCHAR(100),	-- 排序字段
	@IsDesc BIT ,				-- 是否降序排序
	@WhereString VARCHAR(2000), -- 查询字段
	@PageIndex INT ,			-- 当前页数
	@PageSize INT ,				-- 每页条数
	@TotalRecord INT OUTPUT		-- 返回总条数
)
AS
BEGIN
	DECLARE @OrderString VARCHAR(500)
	
	IF(@PageIndex IS NULL OR @PageIndex <= 0)
	BEGIN
		SET @PageIndex = 1
	END
	
	IF(@PageSize IS NULL OR @PageSize <= 0)
	BEGIN
		SET @PageSize = 10
	END
	
	DECLARE @StartRowID INT
	DECLARE @EndRowID INT
	SET @StartRowID = (@PageIndex - 1) * @PageSize + 1
	SET @EndRowID = @PageIndex * @PageSize
	
	IF (@WhereString is null OR @WhereString = '')
	BEGIN
	 	SET @WhereString = '1 = 1'
	END
	
	IF (@OrderFiled IS NULL OR @OrderFiled = '')
	BEGIN
		SET @OrderFiled = 'CreateDate'
	END
	
	IF (@IsDesc IS NULL OR @IsDesc = 1)
	BEGIN
		SET @OrderString = @OrderFiled + ' DESC'
	END
	ELSE
	BEGIN
		SET @OrderString = @OrderFiled + ' ASC'
	END
	
	DECLARE @TotalSQL NVARCHAR(2000)
	SET @TotalSQL = 'SELECT @Total = COUNT(*) FROM ' + @TableName + ' WHERE ' + @WhereString + ''
	EXEC sp_executesql @TotalSQL , N'@Total BIGINT OUT' , @TotalRecord OUTPUT -- 返回总记录数

	DECLARE @SelectSQL NVARCHAR(3000)
	IF(@TotalRecord <= @PageSize AND @PageIndex = 1)
	BEGIN
		SET @SelectSQL = 'SELECT ' + @Fileds + ' FROM ' + @TableName + ' WHERE ' + @WhereString + ' ORDER BY ' + @OrderString
	END
	ELSE
	BEGIN
		SET @SelectSQL = 'SELECT row_number() OVER (ORDER BY ' + @OrderString + ') AS RowId,' + @Fileds + ' FROM ' + @TableName + ' WHERE ' + @WhereString
		SET @SelectSQL = 'SELECT * FROM (' + @SelectSQL + ') AS tab WHERE RowId BETWEEN ' + ltrim(STR(@StartRowID)) + ' AND ' + ltrim(STR(@EndRowID)) + ''
	END
	print @SelectSQL
	EXEC (@SelectSQL)
END

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。