sql多表存储过程分页
㈠ 怎样实现sql数据库中表的分页功能,用存储过程。asp.net 谢谢回答!
create
proc
ProcPageing@pageindex
int,@pagesize
intasbeginselect
top
@pagesize
*
from
TableName
where
ID
not
in(select
(@pageindex-1)*@pagesize
ID
from
TableName
order
by
ID
desc)
oder
by
descendgo
--最简单的分页存错过程
不带条件、表的
ID号连续(这里可以使用
rows_number()
over(ID
order
by
desc)
as
TID)
这样
不管数据库ID是不是连续的ID
这个TID就会是连续的.
㈡ sql 中表Student有50条记录,如何使用存储过程快速分页,输入参数为页数,每页的记录
假设你的表的排序字段是ID,如果不是自己替换掉就行,如果多列可以替换为
ID1,ID2.....按顺序就行
create proc fenye
@x int,----第x页
@y int ----每页显示y条记录
as
declare @sql nvarchar(max);
begin
set @sql='
select * from (
SELECT *,row_number()over(order by ID) as rm FROM Student )t
where t.rm>$y$*($x$-1) and t.rm<=$y$*$x$'
set @sql=replace(@sql,'$y$',@y);
set @sql=replace(@sql,'$x$',@x);
print(@sql);
exec sp_executesql @sql;
end;
---exec fenye 5,20
--显示第五页的数据,每页显示20条
㈢ 求一个sql存储过程分页。支持多表联合查询,模糊查询!
可以加个游标 使用更方便
@PageCount bigint output,--总页数
@Pages bigint output --当前页
as
if @Pages<=0 --判断页数
set @Pages=1
declare @指针定位 bigint
set @指针定位=9*(@Pages-1)--这个是每页10条
declare @hid bigint,--获取定位Id 主要是用自增值判断的
@余数 bigint--存余数 这个余数是 记录数/10 余下的数
select @PageCount=count(*) from [表] where [Id] = @Id
set @余数=@PageCount%10 --这里的@PageCount 是记录总数
if @余数>0
set @PageCount=@PageCount/10+1 --这里的@PageCount是总页数
else
set @PageCount=@PageCount/5 --这里的@PageCount是总页数
if @Pages>@PageCount --@Pages是当前页
set @Pages=@PageCount
declare mycur scroll cursor for
select [Id] from [表] where [Id] = @Id
open mycur
fetch absolute @指针定位 from mycur into @hid --@hid获取定位Id
if @hid is null
set @hid=0
SELECT TOP 10 * --这里的10 是指 页数大小
FROM 表
WHERE (Id NOT IN --------在where后面 可以加条件 如where [列1]=2 and (Id NOT IN-----
(SELECT TOP (@hid) Id
FROM 表
ORDER BY Id))
ORDER BY Id
--上面的是我根据下面的 自己改的 我也不确定速度快否 也请高手看看 不过挺好用--
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP (页大小*(页数-1)) id
FROM 表
ORDER BY id))
ORDER BY ID
这是我自己整理的 你仔细看看 很好用的
㈣ 如何运行sql server分页存储过程
给对应的值,然后执行
go
create proc Fenye
@pageindex int, --用户要查询的页码
@pagesize int, --每页几条
@pagecount int output, --一共查询了多少页
@recordcount int output --一共有多少条数据
as
begin
--把用户要的数据查询出来
--先把数据查询到临时表里面
select ID,Name,Sex into #linshibiao from Users
--再从临时表中进行分页查询
select * from
(select *,rn=ROW_NUMBER() over(order by ID asc) from Users) as t
where t.rn between (@pageindex-1)*@pagesize+1 and @pageindex*@pagesize
--2.设置 @pagecount @recordcount 的值
--计算总的记录条数
set @recordcount=(select COUNT(*) from #linshibiao);
--计算所有的页数
set @pagecount=CEILING(@recordcount*0.1/@pagesize)
end
执行分页存储过程
go
declare
@pagecount int,
@recordcount int
exec Fenye 1,2,3,5;
㈤ 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
㈥ 数据库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注入
㈦ sql存储过程分页 临时表问题
sql分页不一定用存储过程,就过个人认为存储过程尽量少用!
--前提是必需有一列是自动增长类型,唯一性
--方法一
SELECT DISTINCT TOP 8 CategoryID
FROM tbl_Proct_Procts
WHERE (UserID = 73) AND (CategoryID >
(SELECT MAX(categoryid)
FROM (SELECT DISTINCT TOP 16 categoryid
FROM tbl_proct_procts where userid=73
ORDER BY categoryid) AS b))
ORDER BY CategoryID
--方法二
select top 10 * from [order details]
where orderid>all(select top 10 orderid from [order details] order by orderid)
order by orderid
下面的来自CSDN-------------------------------------
SQL Server 存储过程的分页,这个问题已经讨论过几年了,很多朋友在问我,所以在此发表一下我的观点
建立表:
CREATE TABLE [TestTable] (
[ID] [int] IDENTITY (1, 1) NOT NULL ,
[FirstName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[LastName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NULL ,
[Country] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[Note] [nvarchar] (2000) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
插入数据:(2万条,用更多的数据测试会明显一些)
SET IDENTITY_INSERT TestTable ON
declare @i int
set @i=1
while @i<=20000
begin
insert into TestTable([id], FirstName, LastName, Country,Note) values(@i, 'FirstName_XXX','LastName_XXX','Country_XXX','Note_XXX')
set @i=@i+1
end
SET IDENTITY_INSERT TestTable OFF
-------------------------------------
分页方案一:(利用Not In和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 20 id
FROM TestTable
ORDER BY id))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID NOT IN
(SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id))
ORDER BY ID
-------------------------------------
分页方案二:(利用ID大于多少和SELECT TOP分页)
语句形式:
SELECT TOP 10 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 20 id
FROM TestTable
ORDER BY id) AS T))
ORDER BY ID
SELECT TOP 页大小 *
FROM TestTable
WHERE (ID >
(SELECT MAX(id)
FROM (SELECT TOP 页大小*页数 id
FROM 表
ORDER BY id) AS T))
ORDER BY ID
-------------------------------------
分页方案三:(利用SQL的游标存储过程分页)
create procere XiaoZhengGe
@sqlstr nvarchar(4000), --查询字符串
@currentpage int, --第N页
@pagesize int --每页行数
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1,@rowcount=@rowcount output
select ceiling(1.0*@rowcount/@pagesize) as 总页数--,@rowcount as 总行数,@currentpage as 当前页
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
其它的方案:如果没有主键,可以用临时表,也可以用方案三做,但是效率会低。
建议优化的时候,加上主键和索引,查询效率会提高。
通过SQL 查询分析器,显示比较:我的结论是:
分页方案二:(利用ID大于多少和SELECT TOP分页)效率最高,需要拼接SQL语句
分页方案一:(利用Not In和SELECT TOP分页) 效率次之,需要拼接SQL语句
分页方案三:(利用SQL的游标存储过程分页) 效率最差,但是最为通用
在实际情况中,要具体分析。
更多的讨论见:
http://community.csdn.net/Expert/topic/3292/3292678.xml?temp=.1621515
㈧ JSP中如何使用SQL存储过程或JAVA实现分页显示多表查询数据
Java调用
存储过程
CallableStatement
proc
=
null;
proc
=
conn.prepareCall("{
call
SCOTT.TESTA(?,?)
}");
proc.setString(1,
"100");
proc.registerOutParameter(2,
Types.VARCHAR);
proc.execute();
String
testPrint
=
proc.getString(2);
第二个问号是out类型的参数
JAVA实现分页显示多表查询数据?
分页可以使用网络上提供的分页类的做。。
至于多表查询的数据
只是
多张表关联在一起,跟分页没有太大的关系