C#.net + sql server2000 分页存储过程
RT
我自己写了2个,一个是排序必须是 主键 top+2分法。另一个是 临时表,任意字段排序。
我现在 数据表 有500W+ 数据,而且 需要做关联,或者视图 。排序字段也任意
用临时表 效果不好,7 8秒钟。
第一种 如果是单表 + 主键排序 非常快 1000W数据没问题。
可如果是视图,或者需要关联表显示 就大打折扣咯。 排序不是主键 更是直接不能用。
贴下第二种 方法!
alter PROCEDURE proc_paged
(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@pageSize int = 10, ----每页显示的记录个数
@page int = 1, ----要显示那一页的记录
@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添加
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 output ----查询到的记录数
)
AS
SET NOCOUNT ON
Declare @strTmp nvarchar(1000) ----存放取得查询结果总数的查询语句
DECLARE @PageLowerBound int
DECLARE @PageUpperBound int
-- Set the page bounds
SET @PageLowerBound = @PageSize * @page
SET @PageUpperBound = @PageLowerBound + @PageSize + 1
--------生成查询语句--------
--此处@strTmp为取得查询结果数量的语句
if @strCondition is null or @strCondition='' --没有设置显示条件
begin
set @strTmp = 'select @Counts=count(*) FROM '+@tblName
end
else
begin
set @strTmp = 'select @Counts=count(*) 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
create table #tempNews (id int identity(1,1),nid int)
if(@Sort=0)
begin
set @strTmp='insert into #tempNews(nid) select '+@id+' from '+@tblname+' where 1=1 '+@strCondition+' order by '+@fldSort+' asc'
end
else
begin
set @strTmp='insert into #tempNews(nid) select '+@id+' from '+@tblname+' where 1=1 '+@strCondition+' order by '+@fldSort+' desc'
end
execute(@strTmp)
set @strTmp='SELECT' +@fldName+' FROM '+@tblname+' TableA, #tempNews T WHERE T.nid = TableA.'+@ID+' AND T.id > '+ cast(@PageLowerBound as varchar)+' AND T.id < '+cast(@PageUpperBound as varchar)+' ORDER BY T.id'
execute(@strTmp)
SET NOCOUNT OFF
GO
第一种http://topic.csdn.net/u/20090515/11/96dc896e-ce4c-493b-b6fd-7682e73dcae9.html
求高手 发下 效率高的存储过程!