/*
@tbname nvarchar(255), --要分页显示的表名 注意:此处可以是表名,视图片,函数名
@FieldKey nvarchar(255), --用于定位记录的主键(惟一键)字段,只能是单个字段
@PageCurrent int=1, --要显示的页码
@PageSize int=10, --每页的大小(记录数)
@FieldShow nvarchar(1000), --以逗号分隔的要显示的字段列表,如果不指定,则显示所有字段
@FieldOrder nvarchar(1000), --以逗号分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
--用于指定排序顺序
@Where nvarchar(1000), --查询条件
@PageCount int OUTPUT --总页数
tbname这个参数是视图名称,也就是你必须要先建立一个视图,视图里获取的数据集就是你真正要查询的数据集了
这个视图你可以进行多条连接,随便你怎么写,只要是select就好。
那么为什么我们要用存储过程来调用这个视图呢,主要是为了传参数给它。
FieldKey这个是主键,是必须的,也是唯一的索引,这样我们才能获取到正确的分页数据,否则就是乱的。
PageCurrent 这个参数就是你需要获取的,当前页的页码了,比如,你需要第五页,那我们就传5
PageSize 这个参数是每页显示的条数,随你喜欢。推荐10-25条,根据你的UI显示需要。
FieldShow 这个是你要显示的字段,这些视段是从视图中提取的,所以名称要与视图的字段相同。如果不填写默认提取的是所有的字段。如果是多个字段,那么就用逗号分隔开,如id,userName,Address
FieldOrder 这个是用来排序的,方法和SQL排序方法是一样的,但是我们传的参数不带order by,排序的对象是视图出来的数据集
如:id desc,username Asc
where参数是个比较关键的参数,该参数自带where所以我们只需要传条件,如 id=1 and userName='A.Z猫'
PageCount 是一个output参数,即是这调用这个存储过程后,除了返回给你你所要查询的页码的数据集以外,还会返回你一个PageCount的output参数,这个参数的值是一共分了多少页,也就是总页数。
*/
--SET ANSI_NULLS ON
--SET QUOTED_IDENTIFIER ON
--GO
--
--DECLARE @tbname NVARCHAR(255) ,
-- @FieldKey NVARCHAR(255) ,
-- @PageCurrent INT,
-- @PageSize INT ,
-- @FieldShow NVARCHAR(1000) ,
-- @FieldOrder NVARCHAR(1000) ,
-- @Where NVARCHAR(1000) ,
-- @PageCount INT
--
--SELECT @tbname='PRD_JO_WIP_HD',@FieldKey='STOCK_ID',@PageCurrent=2,@PageSize=10
--SELECT @Where='',@FieldShow='*',@FieldOrder='JOB_ORDER_NO'
--SELECT @PageCount=NULL
ALTER PROC [dbo].[CP_SELECT_SPLIT_PAGE_X]
@tbname NVARCHAR(255) ,
@FieldKey NVARCHAR(255) ,
@PageCurrent INT = 1 ,
@PageSize INT = 10 ,
@FieldShow NVARCHAR(1000) ,
@FieldOrder NVARCHAR(1000) ,
@Where NVARCHAR(1000) ,
@PageCount INT OUTPUT
AS
DECLARE @sql NVARCHAR(4000)
SET NOCOUNT ON
--检查对象是否有效
IF OBJECT_ID(@tbname) IS NULL
BEGIN
RAISERROR(N'对象"%s"不存在',1,16,@tbname)
RETURN
END
IF OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsTable') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsView') = 0 AND OBJECTPROPERTY(OBJECT_ID(@tbname) , N'IsTableFunction') = 0
BEGIN
RAISERROR(N'"%s"不是表、视图或者表值函数',1,16,@tbname)
RETURN
END
--分页字段检查
IF ISNULL(@FieldKey , N'') = ''
BEGIN
RAISERROR(N'分页处理需要主键(或者惟一键)',1,16)
RETURN
END
--其他参数检查及规范
IF ISNULL(@PageCurrent , 0) < 1
SET @PageCurrent = 1
IF ISNULL(@PageSize , 0) < 1
SET @PageSize = 10
IF ISNULL(@FieldShow , N'') = N''
SET @FieldShow = N'*'
IF ISNULL(@FieldOrder , N'') = N''
SET @FieldOrder = N''
ELSE
SET @FieldOrder = N'ORDER BY ' + LTRIM(@FieldOrder)
IF ISNULL(@Where , N'') = N''
SET @Where = N''
ELSE
SET @Where = N'WHERE (' + @Where + N')'
--如果@PageCount为NULL值,则计算总页数(这样设计可以只在第一次计算总页数,
--以后调用时,把总页数传回给存储过程,避免再次计算总页数,对于不想计算总页数的处理而言,可以给@PageCount赋值)
IF @PageCount IS NULL
BEGIN
SET @sql = N'SELECT @PageCount=COUNT(*)' + N' FROM ' + @tbname + N' ' + @Where
EXEC sp_executesql @sql , N'@PageCount INT OUTPUT' , @PageCount OUTPUT
SET @PageCount = (@PageCount + @PageSize - 1) / @PageSize
END
--计算分页显示的TOPN值
DECLARE @TopN VARCHAR(20) , @TopN1 VARCHAR(20)
SELECT @TopN = @PageSize , @TopN1 = @PageCurrent * @PageSize
--第一页直接显示
IF @PageCurrent = 1
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' '+@Where
+N' '+@FieldOrder)
ELSE
BEGIN
SELECT @PageCurrent = @TopN1 , @sql = N'SELECT @n=@n-1,@s=CASE WHEN @n<' + @TopN + N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST(' + @FieldKey + N' as varchar(8000))),N'''''''') ELSE N'''' END FROM ' + @tbname + N' ' + @Where + N' ' + @FieldOrder
SET ROWCOUNT @PageCurrent
EXEC sp_executesql @sql , N'@n INT,@s nvarchar(4000) OUTPUT' , @PageCurrent , @sql OUTPUT
SET ROWCOUNT 0
IF @sql = N''
EXEC(N'SELECT TOP 0' +N' '+@FieldShow +N' FROM '+@tbname)
ELSE
BEGIN
SET @sql = STUFF(@sql , 1 , 1 , N'')
--执行查询
EXEC(N'SELECT TOP '+@TopN
+N' '+@FieldShow
+N' FROM '+@tbname
+N' WHERE '+@FieldKey
+N' IN('+@sql
+N') '+@FieldOrder)
END
END