自己写的基于窗体函数的分页存储过程

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- =============================================
-- Author:		XiaoDong.Bai
-- Create date: 2013-11-7
-- Description:	ReWrite Othre's Procedure
-- =============================================
CREATE PROCEDURE [dbo].[ProcGetPageData]
	-- Add the parameters for the stored procedure here
	@PageSize INT = 20,			-- 每页输出的记录数
	@PageIndex INT = 1,			-- 当前页数
	@PrimaryKey VarChar(1000),  -- 单一主键或唯一值键
	@FieldList VarChar(100),    -- 要查询的字段集,全部则为*
	@TableName VarChar(200),	-- 表名
	@SortType VARCHAR(1000) = '',	-- 排序(不含'Order By' 如'id desc')
	@Where VARCHAR(1000) = '',		-- 条件(条件不含'where')
	@RecordCount  INT = 0 OUTPUT,	-- 返回总记录数
	@PageCount  INT = 0 OUTPUT		-- 返回总页数
	
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	SET NOCOUNT ON;
	IF ISNULL(@TableName,'') = '' OR ISNULL(@FieldList,'') = ''
		BEGIN
			PRINT('ERR_00')
			RETURN
		END
	DECLARE @Sql NVARCHAR(1000)
	IF ISNULL(@Where,'') = ''
		SET @Where = ' 1 = 1 '
	
	-- 获取总页数和总记录数
	SET @Sql = 'SELECT @TotalCount = COUNT(1),@TotalPageCount = CEILING((COUNT(1) + 0.0) /' +  CAST(@PageSize AS NVARCHAR) +') FROM ' + @TableName + ' WHERE ' + @Where
	EXECUTE SP_EXECUTESQL @Sql,N'@TotalCount INT OUTPUT,@TotalPageCount INT OUTPUT',@RecordCount OUTPUT,@PageCount OUTPUT
			
	IF ISNULL(@SortType,'') = ''
		SET @SortType =  @PrimaryKey
	
	SET @Sql = 'SELECT ' + @FieldList + ',ROW_NUMBER() OVER(ORDER BY ' + @SortType + ' ) AS ROWNUM FROM ' + @TableName + ' WHERE ' + @Where
	
	SET @Sql = 'SELECT ' + @FieldList + ' From (' + @Sql + ') AS T WHERE T.ROWNUM BETWEEN ' + CAST(((@PageIndex - 1) * @PageSize + 1) AS VARCHAR) + ' AND ' + CAST(@PageIndex * @PageSize AS VARCHAR)
	
	EXEC(@Sql)
	
END

GO
自己在前人基础上写的,窗体函数的执行效率比较高一些,不足之处请评论指正。

你可能感兴趣的:(存储过程,分页,窗体函数 )