请问谁有 sql 2000支持分组的分页存储过程

chongfei 2009-07-10 11:12:01
请问谁有 sql 2000支持分组的分页存储过程
请问谁有 sql 2000支持分组的分页存储过程
请问谁有 sql 2000支持分组的分页存储过程
请问谁有 sql 2000支持分组的分页存储过程
请问谁有 sql 2000支持分组的分页存储过程
...全文
222 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ChinaJiaBing 2009-07-10
  • 打赏
  • 举报
回复

--请问一楼怎么做分组查询
baidu里搜搜...
hery2002 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 chongfei 的回复:]
请问一楼怎么做分组查询
[/Quote]
弱弱地问一下,你这个分组查询时什么意思?
按照栏位来分组么?还是按照你传入的参数来分组.
异或按照什么规则来分组,
如果作为通用的存储过程的话,是否需要对每个表的除了分组外的所有字段做聚合,
做什么聚合?有规则定义么?
chongfei 2009-07-10
  • 打赏
  • 举报
回复
请问一楼怎么做分组查询
--小F-- 2009-07-10
  • 打赏
  • 举报
回复
**********************************************
名称:SQL Server 2005 中通用的分页存储过程
作者:李中华
日期:2006年3月
qq:298111533
Email: dagecc@hotmail.com功能:具有分组,排序,分区和分页功能。
**********************************************/if (object_id(N'syspr_TablePaginationSearch',N'P') is not null)
drop procedure dbo.syspr_TablePaginationSearch
go
create procedure syspr_TablePaginationSearch
(
@SelectField nvarchar(512)='*' -- Select语句字段,调用的时候不要输入"select"
,@FormTables nvarchar(512) -- Form子句,表名,包括架构名,调用的时候不要输入"from"
,@WhereField nvarchar(512)=null -- Where语句、判断字段,调用的时候不要输入"where"
-----------------------------------------------------
,@OverPartitionField nvarchar(512)=null -- 分区字段,
,@OverOrderField nvarchar(512) -- 分页字段,主要排序字段,必须
,@GroupField nvarchar(512)=null -- 分组字段
,@HavingField nvarchar(512)=null -- 分组判断条件
,@OrderField nvarchar(512)=null -- 排序字段
-----------------------------------------------------
,@PageSize int=10 -- 页长
,@Page int=1 -- 页
-----------------------------------------------------
,@ErrorProcedure nvarchar(128)=null output -- 错误存储过程名
,@ErrorNumber int=0 output -- 错误编号
,@ErrorMessage nvarchar(512)=null output -- 错误信息
)
as
begin
--定义第一行记录
declare @firstRow int;
--定义最后一条记录
declare @lastRow int;--设置第一条记录
set @firstRow=((@Page-1)*@PageSize)+1;
--设置最后一条记录
set @lastRow=@firstRow+@PageSize;--定义查询SQL字段
declare @sqlString nvarchar(512);
--定义Select语句,内查询使用
declare @selectString nvarchar(512);
--定义Where字段,内查询使用
declare @whereString nvarchar(512);
--定义Form子句,内查询使用
declare @formString nvarchar(512);
--定义分组字段,内查询使用
declare @groupString nvarchar(512);
--定义Having子句,内查询使用
declare @havingString nvarchar(512);
--定义排序字段,外查询使用
declare @OrderString nvarchar(512);--组装Select子句-----------------------------------
set @SelectField=isnull(@SelectField,N' * ');
if(@SelectField='')
set @SelectField=N' *' ;
--组装select子句到row_number()
set @selectString=N' select '+ @SelectField+ ', Row_Number() over( ';
--组装到分区partition by 表达式
set @OverPartitionField=isnull(@OverPartitionField,N'');
if (@OverPartitionField<>'')
set @selectString= @selectString+ ' partition by '+ @OverPartitionField;
--组装到排序分页order by 表达式
set @OverOrderField=isnull(@OverOrderField,N'');
if (@OverOrderField<>'')
set @selectString= @selectString+ ' order by '+ @OverOrderField+ N') as RowNumber ';
--over---------------------------------------------
--组装Form子句------------------------------------
set @formString= N' from '+ @FormTables;
--组装Where判断子句------------------------------
set @WhereField=isnull(@WhereField,N'');
if(@WhereField<>'')
set @whereString=N' where '+ @WhereField;
else
set @whereString=N'';
--where判断子句组装完毕-------------------------
--组装group by分组子句--------------------------
set @GroupField=isnull(@GroupField,N'');
if (@GroupField<>'')
begin
set @groupString= N' group by '+ @GroupField; --组装having分组判断条件
set @HavingField= isnull(@HavingField,N'');
if (@HavingField<> N'')
set @havingString= N' having '+ @HavingField;
else
set @havingString=N'';
end
else
begin
set @groupString= N'';
set @havingString=N'';
end
--over-------------------------------------------
--组装order by外排序子句-----------------------
set @OrderField=isnull(@OrderField,N'');
if (@OrderField<>'')
set @OrderString= N' order by '+ @OverOrderField+ N' , '+ @OrderField;
else
set @OrderString= N'';
--如果@groupString不为空,则外排序不起作用
if (@groupString<>N'')
set @OrderString=N'';
--over-------------------------------------------
--组装分页查询语句
set @sqlString=
N'select * '+
N'from '+
N' ( '+
@selectString+
@formString+
@whereString+
@groupString+
@havingString+
N' ) as TB '+
N'where '+
N' TB.RowNumber>='+cast(@firstRow as nvarchar(10))+
N' and TB.RowNumber<'+cast(@lastRow as nvarchar(10))+
@orderString
--over-------------------------------------------
--执行SQL,返回影响行数;如有异常,则抛出,并赋值输出参数
begin try
exec (@sqlString);
return @@rowcount;
end try
begin catch
set @ErrorProcedure=Error_Procedure();
set @ErrorNumber=error_number();
set @ErrorMessage=error_message();
end catch;end
go-----------------------------------------------------------
--简单的测试,查询AdventureWorks库的Person.Address表。
--以addressid字段顺序分页、并按PostalCode ,StateProvinceID等字段排序。exec dbo.syspr_TablePaginationSearch
@SelectField='*'
,@FormTables='AdventureWorks.Person.Address'
,@whereField='addressid>100'
,@OverOrderField='addressid asc'
,@OrderField='PostalCode ,StateProvinceID'
,@Page=1
,@PageSize=10
go
--简单的测试,分组统计addressid字段,并分页显示结果集。exec dbo.syspr_TablePaginationSearch
@SelectField='count(addressid) as addressCount,city'
,@FormTables='AdventureWorks.Person.Address'
,@OverOrderField='count(addressid) desc'
,@GroupField='city'
,@Page=1
,@PageSize=10
go
--连接查询并分页
exec dbo.syspr_TablePaginationSearch
@SelectField=N'
addr.AddressLine1,
addr.AddressLine2,
addr.City,
sp.Name as ProvinceName,
addr.PostalCode,
addr.rowguid,
addr.ModifiedDate'
,@FormTables=N'
AdventureWorks.Person.Address as addr
inner join
AdventureWorks.Person.StateProvince as sp
on addr.StateProvinceID=sp.StateProvinceID'
,@OverOrderField='addressid asc'
,@Page=1
,@PageSize=10
go
--小F-- 2009-07-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 lihan6415151528 的回复:]
SQL codeCreatePROCEDURE dbo.proc_ListPage
(@tblNamenvarchar(200),----要显示的表或多个表的连接@fldNamenvarchar(500)='*',----要显示的字段列表@pageSizeint=1,----每页显示的记录个数@pageint=10,----要显示那一页的记录@pageCountint=1 output,----查¡­
[/Quote]
......
lihan6415151528 2009-07-10
  • 打赏
  • 举报
回复

Create PROCEDURE dbo.proc_ListPage
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 1, ----每页显示的记录个数
@page int = 10, ----要显示那一页的记录
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output, ----查询到的记录数
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@ID nvarchar(150), ----主表的主键
@Dist bit = 0 , ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
@strSql nvarchar(1000) = '' output
)
AS
SET NOCOUNT ON
Declare @sqlTmp nvarchar(1000) ----存放动态生成的SQL语句
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
Declare @strID nvarchar(1000) ----存放取得查询开头或结尾ID的查询语句

Declare @strSortType nvarchar(10) ----数据排序规则A
Declare @strFSortType nvarchar(10) ----数据排序规则B

Declare @SqlSelect nvarchar(50) ----对含有DISTINCT的查询进行SQL构造
Declare @SqlCounts nvarchar(50) ----对含有DISTINCT的总数查询进行SQL构造


if @Dist = 0
begin
set @SqlSelect = 'select '
set @SqlCounts = 'Count(*)'
end
else
begin
set @SqlSelect = 'select distinct '
set @SqlCounts = 'Count(DISTINCT '+@ID+')'
end


if @Sort=0
begin
set @strFSortType=' ASC '
set @strSortType=' DESC '
end
else
begin
set @strFSortType=' DESC '
set @strSortType=' ASC '
end



--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
set @sqlTmp = @fldName + ' From ' + @tblName
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName
set @strID = ' From ' + @tblName
end
else
begin
set @sqlTmp = + @fldName + 'From ' + @tblName + ' where (1>0) ' + @strCondition
set @strTmp = @SqlSelect+' @Counts='+@SqlCounts+' FROM '+@tblName + ' where (1>0) ' + @strCondition
set @strID = ' From ' + @tblName + ' where (1>0) ' + @strCondition
end

----取得查询结果总数量-----
exec sp_executesql @strTmp,N'@Counts int out ',@Counts out
declare @tmpCounts int
if @Counts = 0
set @tmpCounts = 1
else
set @tmpCounts = @Counts

--取得分页总数
set @pageCount=(@tmpCounts+@pageSize-1)/@pageSize

/**//**当前页大于总页数 取最后一页**/
if @page>@pageCount
set @page=@pageCount

--/*-----数据分页2分处理-------*/
declare @pageIndex int --总数/页大小
declare @lastcount int --总数%页大小

set @pageIndex = @tmpCounts/@pageSize
set @lastcount = @tmpCounts%@pageSize
if @lastcount > 0
set @pageIndex = @pageIndex + 1
else
set @lastcount = @pagesize

--//***显示分页
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理
begin
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
+' order by '+ @fldSort +' '+ @strFSortType+')'
+' order by '+ @fldSort +' '+ @strFSortType
end
else
begin
set @page = @pageIndex-@page+1 --后半部分数据处理
if @page <= 1 --最后一页数据显示
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
else
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
+' order by '+ @fldSort +' '+ @strSortType+')'

+' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
end
end

else --有查询条件
begin
if @pageIndex<2 or @page<=@pageIndex / 2 + @pageIndex % 2 --前半部分数据处理
begin
set @strTmp=@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName +' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-1) as Varchar(20)) +' '+ @ID +' from '+@tblName
+' Where (1>0) ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType+')'
+' ' + @strCondition + ' order by '+ @fldSort +' '+ @strFSortType
end
else
begin
set @page = @pageIndex-@page+1 --后半部分数据处理
if @page <= 1 --最后一页数据显示
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@lastcount as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
else
set @strTmp=@SqlSelect+' * from ('+@SqlSelect+' top '+ CAST(@pageSize as VARCHAR(4))+' '+ @fldName+' from '+@tblName
+' where '+@ID+' not in('+ @SqlSelect+' top '+ CAST(@pageSize*(@page-2)+@lastcount as Varchar(20)) +' '+ @ID +' from '+@tblName
+' where (1>0) '+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+')'
+ @strCondition +' order by '+ @fldSort +' '+ @strSortType+') AS TempTB'+' order by '+ @fldSort +' '+ @strFSortType
end
end

------返回查询结果-----
set @strSql = @strTmp
exec sp_executesql @strTmp
--print @strTmp


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/trip_008/archive/2007/03/29/1544959.aspx

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧