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實現分頁顯示多表查詢數據?
分頁可以使用網路上提供的分頁類的做。。
至於多表查詢的數據
只是
多張表關聯在一起,跟分頁沒有太大的關系