从通用分页存储过程[ROWCOUNT方式]抽出适合自己需求的分页过程
通用分页存储过程很实用,但毕竟不是全适用于一些环境,譬如我遇到过一种情况,需要先外链两个表,然后再关联几个表,总之参数传递很烦人,这里不细说了,现在只谈实现查询后,怎么分页的简单技巧
1,建立用户函数
CREATE function F_xxxx(@ID nvarchar(36),@Key nvarchar(36),......)
{
......//这里查询出你需要分页的所有数据,可以带参数来查询
}
建函数的目的是为了整合查询的数据,主要是可以带入参数,很方便.
注,函数中没有exec语句,不可以拼接SQL,不过可以调用存储过程.
2,建分页存储过程,具体框架和说明如下
1,建立用户函数
CREATE function F_xxxx(@ID nvarchar(36),@Key nvarchar(36),......)
{
......//这里查询出你需要分页的所有数据,可以带参数来查询
}
建函数的目的是为了整合查询的数据,主要是可以带入参数,很方便.
注,函数中没有exec语句,不可以拼接SQL,不过可以调用存储过程.
2,建分页存储过程,具体框架和说明如下
/*080520 by zjyaoo@live.cn*/
CREATE PROCEDURE dbo.SPCustomPaging
(
@PageSize int =15, --页面大小
@PageNumber int =1, --页码
@传入到函数的参数1 nvarchar(36), --传入到函数的参数,这里参数个数根据建的函数来决定
@传入到函数的参数2 nvarchar(36), --传入到函数的参数,这里参数个数根据建的函数来决定
@StrWhere nvarchar(2000)=' AND 1=1' , --条件,注:传入的@StrWhere需要replace.(''','''')处理
@RecordCount int =0 output --返回总的条数
)
AS
DECLARE @strStartRow int
IF @PageNumber < 1
SET @PageNumber = 1
SET @strStartRow =(@PageNumber - 1)* @PageSize + 1 --设置其实页码
----
DECLARE @str_Count_SQL nvarchar(500)
SET @str_Count_SQL= 'SELECT @TotalCount=count(*) FROM [F_建立的的函数]('''+@函数参数1+''','''+@函数参数2+''') Where 1=1 ' + @StrWhere --1=1,用于外接条件
EXEC sp_executesql @str_Count_SQL,N'@TotalCount int=0 output',@RecordCount output --获取总的条数
Declare @Sql nvarchar(1000)
set @Sql =
'DECLARE @SortColumn nvarchar(255) --建几个临时变量
DECLARE @SortNullValue nvarchar(255)
DECLARE @PKStartValue nvarchar(255)
SET @SortNullValue = CAST('''' as int)
SET ROWCOUNT '+ cast(@strStartRow as nvarchar(5)) +' --整数转为字符
SELECT @SortColumn= isNull([函数中的分类字段] ,@SortNullValue), @PKStartValue = [函数中的关键字段] FROM [F_建立的的函数]('''+@函数参数1+''','''+@函数参数2+''') Where 1=1 '+@StrWhere +' ORDER BY [函数中的分类字段], [再加个函数中的关键字段] Desc
SET ROWCOUNT '+ cast(@PageSize as nvarchar(5)) +' --整数转为字符
SELECT * FROM F_ManufacturerDiscount('''+@OrgID+''')
WHERE (isNull([函数中的分类字段],@SortNullValue)>@SortColumn or (isNull([函数中的分类字段],@SortNullValue)=@SortColumn and [函数中的关键字段]<=@PKStartValue)) '+@StrWhere +' ORDER BY [函数中的分类字段],[函数中的关键字段] Desc
RETURN'
Exec (@Sql)
GO
CREATE PROCEDURE dbo.SPCustomPaging
(
@PageSize int =15, --页面大小
@PageNumber int =1, --页码
@传入到函数的参数1 nvarchar(36), --传入到函数的参数,这里参数个数根据建的函数来决定
@传入到函数的参数2 nvarchar(36), --传入到函数的参数,这里参数个数根据建的函数来决定
@StrWhere nvarchar(2000)=' AND 1=1' , --条件,注:传入的@StrWhere需要replace.(''','''')处理
@RecordCount int =0 output --返回总的条数
)
AS
DECLARE @strStartRow int
IF @PageNumber < 1
SET @PageNumber = 1
SET @strStartRow =(@PageNumber - 1)* @PageSize + 1 --设置其实页码
----
DECLARE @str_Count_SQL nvarchar(500)
SET @str_Count_SQL= 'SELECT @TotalCount=count(*) FROM [F_建立的的函数]('''+@函数参数1+''','''+@函数参数2+''') Where 1=1 ' + @StrWhere --1=1,用于外接条件
EXEC sp_executesql @str_Count_SQL,N'@TotalCount int=0 output',@RecordCount output --获取总的条数
Declare @Sql nvarchar(1000)
set @Sql =
'DECLARE @SortColumn nvarchar(255) --建几个临时变量
DECLARE @SortNullValue nvarchar(255)
DECLARE @PKStartValue nvarchar(255)
SET @SortNullValue = CAST('''' as int)
SET ROWCOUNT '+ cast(@strStartRow as nvarchar(5)) +' --整数转为字符
SELECT @SortColumn= isNull([函数中的分类字段] ,@SortNullValue), @PKStartValue = [函数中的关键字段] FROM [F_建立的的函数]('''+@函数参数1+''','''+@函数参数2+''') Where 1=1 '+@StrWhere +' ORDER BY [函数中的分类字段], [再加个函数中的关键字段] Desc
SET ROWCOUNT '+ cast(@PageSize as nvarchar(5)) +' --整数转为字符
SELECT * FROM F_ManufacturerDiscount('''+@OrgID+''')
WHERE (isNull([函数中的分类字段],@SortNullValue)>@SortColumn or (isNull([函数中的分类字段],@SortNullValue)=@SortColumn and [函数中的关键字段]<=@PKStartValue)) '+@StrWhere +' ORDER BY [函数中的分类字段],[函数中的关键字段] Desc
RETURN'
Exec (@Sql)
GO