当前位置:首页 » 存储配置 » 分页存储过程

分页存储过程

发布时间: 2022-02-01 18:02:56

A. 为什么要用分页存储过程

分页存储过程

一般的程序, 如果数据量很大的话, 用户查询,一下子返回很大量的数据
一方面 用户也看不过来, 另外一方面, 执行时间也长。
所以需要分页。

至于用存储过程,则是从开发人员的角度来说了。
开发人员的水平,可能各不相同,水平高的,可能写出来的分页的 sql 好一些。
水平差的话, 可能也就有点问题了。
所以用存储过程, 统一用一中固定的方式,进行分页的处理。

B. 存储过程分页查询

不是的 SQL语句每次执行时都要先编译再执行
而存储过程是编译好的SQL语句
一直在SQL服务器的 内存池 中存在

就相当与 一般的SQL语句是在电脑硬盘里面
而 存储过程 是在电脑CPU内存中的
当然 存储过程更快 更高效啦

C. 一个通用的分页存储过程问题

CREATE PROCEDURE X(
@tblName nvarchar(200), ----要显示的表或多个表的连接
@fldName nvarchar(500) = '*', ----要显示的字段列表
@fldSort nvarchar(200) = null, ----排序字段列表或条件
@ID nvarchar(150), ----主表的主键
@pageSize int = 1, ----每页显示的记录个数
@page int = 10, ----要显示那一页的记录
@Sort bit = 0, ----排序方法,0为升序,1为降序(如果是多字段排列Sort指代最后一个排序字段的排列顺序(最后一个排序字段不加排序标记)--程序传参如:' SortA Asc,SortB Desc,SortC ')
@strCondition nvarchar(1000) = null, ----查询条件,不需where
@Dist bit = 0, ----是否添加查询字段的 DISTINCT 默认0不添加/1添加
@pageCount int = 1 output, ----查询结果分页后的总页数
@Counts int = 1 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

------返回查询结果-----
exec sp_executesql @strTmp
GO

D. 一个比较实用的大数据量分页存储过程

一个比较实用的大数据量分页存储过程

create proc sp_PublicTurnPageWebSite( @TBName nvarchar(100)=‘‘, --表名,如 pinyin
@PageSize int=10, --每页的记录数,默认为 10
@CurPage int=1, --表示当前页 1
@KeyField nvarchar(100)=‘ID‘, --关键字段名,默认为 ID,该字段要求是表中的索引 或 无重复和不为空的字段
@KeyAscDesc nvarchar(4)=‘ASC‘, --关键字的升、降序,默认为升序 ASC , 降序为 DESC
@Fields nvarchar(500)=‘*‘, --所选择的列名,默认为全选
@Condition nvarchar(200)=‘‘, --where 条件,默认为空
@Order nvarchar(200)=‘‘ --排序条件,默认为空
) with encryption as
BEGIN
if @TBName = ‘‘
begin
raiserror(‘请指定表名!‘,11,1)
return
end
if @PageSize <=0 or @CurPage <0
begin
raiserror(‘当前页数和每页的记录数都必须大于零!‘,11,1)
return
end
if @KeyAscDesc = ‘DESC‘
set @KeyAscDesc = ‘<‘
else
set @KeyAscDesc = ‘>‘
if @Condition <> ‘‘
set @Condition = ‘ where ‘ + @Condition
一个比较实用的大数据量分页存储过程
declare @SQL nvarchar(2000) set @SQL = ‘‘
if @CurPage = 1
set @SQL = @SQL + ‘SELECT Top ‘ + cast(@PageSize as nvarchar(20)) + ‘ ‘ + @Fields + ‘ FROM ‘ + @TBName + @Condition + ‘ ‘ + @Order
else
begin
declare @iTopNum int
set @iTopNum = @PageSize * (@CurPage - 1)
set @SQL = @SQL + ‘declare @sLastValue nvarchar(100)‘ + char(13)
set @SQL = @SQL + ‘SELECT Top ‘ + cast(@iTopNum as nvarchar(20)) + ‘ @sLastValue=‘ + @KeyField + ‘ FROM ‘ + @TBName + @Condition + ‘ ‘ + @Order + char(13)

declare @Condition2 nvarchar(200)
if @Condition = ‘‘
set @Condition2 = ‘ where ‘ + @KeyField + @KeyAscDesc + ‘@sLastValue ‘
else
set @Condition2 = ‘ and ‘ + @KeyField + @KeyAscDesc + ‘@sLastValue ‘
set @SQL = @SQL + ‘SELECT Top ‘ + cast(@PageSize as nvarchar(20)) + ‘ ‘ + @Fields + ‘ FROM ‘ + @TBName + @Condition + @Condition2 + @Order
end

E. 分页存储过程C# 代码

(1)size每页记录数(2)currIndex当前页(3)count总页数

分页的存储过程:
alter proc Select_Contradict
@qtbid varchar(5),
@qsid varchar(5),
@cid varchar(5),
@title varchar(50),
@htime varchar(50),
@size varchar(5),
@currindex varchar(5)
as
begin
declare @str varchar(700)
declare @where varchar(700)
set @where=''
set @str='select top '+@size+' tt.* from (select qtb.name qtbname,qs.name qsname,c.* from Contradict c inner join QuestionTypeBie qtb on c.qtbid=qtb.qtbid inner join QuestionState qs on c.qsid=qs.qsid) tt where 1=1'
if(@qtbid <> 0) set @where=@where+' and tt.qtbid=convert(int,'+char(39)+@qtbid+char(39)+')'
if(@qsid <> 0) set @where=@where+' and tt.qsid=convert(int,'+@qsid+')'
if(@cid <> 0) set @where=@where+' and tt.id=convert(int,'+@cid+')'
if(@title <> '') set @where=@where+' and tt.title like '+CHAR(39)+'%'+@title+'%'+CHAR(39)
if(@htime <> '') set @where=@where+' and DATEDIFF(DD,tt.HappenTime,'+char(39)+@htime+char(39)+')=0' --以上if为查询条件
set @currindex=@size*(@currindex-1) --筛选掉当前页之前的记录,因top后不能加括号,故这样写
set @where=@where+' and tt.id not in(select top '+@currindex+' tt.id from (select qtb.name qtbname,qs.name qsname,c.* from Contradict c inner join QuestionTypeBie qtb on c.qtbid=qtb.qtbid inner join QuestionState qs on c.qsid=qs.qsid) tt order by tt.id)' --分页的筛选条件
set @where=@where+' order by tt.id' --此order by 的字段需和前面的一致,否则分页效果不对
set @str=@str+@where
print @str
exec (@str)

end

1.select top (1)* from 表 where 条件 and id not in(select top (1)*((2)-1) id from 表 where 条件 order by 排序的字段) order by 排序的字段
2.在展示数据页面添加(1)(2)(3)属性
private int Size = 5;
public int currindex
{
set { ViewState["currindex"] = value; }
get { return Convert.ToInt32(ViewState["currindex"]); }
}
public int count
{
set { ViewState["count"] = value; }
get { return Convert.ToInt32(ViewState["count"]); }
}
3.查询总记录数给临时变量temp
//总个数
private int CountTemp()
{
return new ContradictManager().GetCount();
}
4.获取总页数
private int CountSize()
{
return count = (CountTemp() / Size) + (CountTemp() % Size > 0 ? 1 : 0);
}
5.绑定数据,dataSource=查询方法((1),(2))
6.设置上一页,下一页,(2)需要单击时++或--,执行3,4,5,6
if((2)>=(3)) //下一页不可用
if((2)<=1) //上一页不可用
7.页面首次加载事件:(2)=1;执行3,4,5,6
以上是我以前面试前总结准备的资料,按照这个流程分页绝对能搞定,但你要是看不懂我就没办法了

F. SQL分页与存储过程分页是一样的吗

它们是不一样的。
SQL分页:
SQL数据是以页为单位存储在文件中的,每个页面8KB。当往一个页面中插入或者修改数据并会导致该页面的数据会超出8KB时,SQL Server就会将页面拆分成两页,从而能够容纳新插入的数据。

存储过程分页是另外一个概念。当查询返回的结果集很大时,为了提高效率,将结果集分成若干小页面,并只将用户当前需要的页面返回给应用程序。一个很好的应用案例:当你在网络输入关键字,能搜索到成千上万的网页。如果将所有搜索到的结果全部一次显示出来,将会很费时间和资源。网络按照排名将每10个搜索结果分成一页,每次显示一页。用户总是能很快见到结果。

G. sql 分页存储过程多表怎么写

举例:

查询新闻和新闻分类名称的分页存储过程:

CREATEPROCGetNews
(
@PageIndexINT,--分页索引
@PageSizeINT,--每页显示数据条数
@AllLineINTOUTPUT--总条数
)
AS
BEGIN
SELECT*
FROM(SELECTROW_NUMBER()OVER(ORDERBYNewsOnTopTimeDESC,NewsIDDESC)ASrowindex,
a.*,
b.TypeTitle
FROMNewsa
INNERJOINdbo.NewsTypebONa.TypeId=b.TypeId
)t
WHEREt.rowindexBETWEEN@PageSize*(@PageIndex-1)+1
AND@PageSize*(@PageIndex-1)+@PageSize

SELECT@AllLine=COUNT(1)
FROMNewsa
INNERJOINdbo.NewsTypebONa.TypeId=b.TypeId
END

H. SQLServer数据库存储过程分页是怎样的

存储过程:create Procere pname
( @pageIndex int,@pageSize)
as
select * from tableName order by id
offset @pageIndex * pageSize fetch next pageSize rows only
分页:
sqlserver 在2008之前 使用 top 和 not int top 的方式来做分页
2008以后使用 row_number() 函数作为分页关键函数
2012使用 offset 1 fetch next 10 rows only
你问了2个问题,你可以优先把视图,存储过程,触发器等弄明白,分页是查询,在存储过程里可以写复杂的sql文,只是在运行时是预编译和参数化查询防止sql注入

I. oracle中建分页查询的存储过程

数据库中定义一个包,定义游标类型,比如可以这样:
create or replace package package_name
as
type outcur is ref cursor;
end ;
然后存储过程返回结果集:
create procere ttt( p_cur out package_name.outcur) as
begin open p_cur for
select ......;
end;

这样就可以返回结果集了.
如果数据量太大,返回全部记录再通过程序控制分页意义不大,效率同样太低,楼上的那个rownbr我没听过,只知道rownum,但这个伪列是不能满足分页要求的,如果数据量非常大,快速分页的话可以考虑用rowid这个列,
试试
select rowid from 任意表;
能看出结果了吧.剩下的自己想办法吧.

J. sql中使用存储过程实现分页代码

SELECT * FROM
(SELECT ROW_NUMBER() OVER (ORDER BY "字段" ) AS RowNum
FROM “表名”) as SelectedTable where "字段"=“值” between "开始数字" and “结束数字”
AJAX方面可以直接使用jquery就OK了。干嘛自己写?

热点内容
算法和人性 发布:2025-01-20 03:28:31 浏览:473
软件编程1级 发布:2025-01-20 03:19:39 浏览:952
嫁个编程男 发布:2025-01-20 02:51:39 浏览:933
挂劳文件夹 发布:2025-01-20 02:44:22 浏览:521
写编程英文 发布:2025-01-20 02:37:50 浏览:16
安卓怎么修改饥荒 发布:2025-01-20 02:20:54 浏览:619
android64位开发环境 发布:2025-01-20 01:58:01 浏览:262
阿里云服务器能搭美国站点 发布:2025-01-20 01:49:34 浏览:278
安卓手机壁纸如何更换成动态壁纸 发布:2025-01-20 01:40:27 浏览:706
安卓微信签名在哪里修改 发布:2025-01-20 01:25:31 浏览:110