當前位置:首頁 » 存儲配置 » 存儲過程翻頁

存儲過程翻頁

發布時間: 2022-07-14 02:21:04

A. 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

B. 用存儲過程怎麼寫分頁

create proc 電影存儲過程 --翻頁存儲過程
@PageSize int, --每頁面顯示數據條數
@PageIndex int, --頁面索引
@PageCount int output, --總頁數
@名稱 nvarchar(100)
as
--查詢范圍 (@PageSize*@PageIndex+1) 起始行
-- @PageSize*(@PageIndex+1) 結束行

select * from(select Row_Number() over (order by 影片ID) as id, * from(
select * from 電影 where 名稱 like '%'+@名稱+'%' or 主演 like '%'+@名稱+'%' )a )b where id between (@PageSize*@PageIndex+1) and @PageSize*(@PageIndex+1)

--得到數據行數
select @PageCount=count(1) from 電影 where 名稱 like '%'+@名稱+'%' or 主演 like '%'+@名稱+'%'
--計算出總行數
set @PageCount= (@PageCount-1)/@PageSize+1
print @PageCount

C. 存儲過程的翻頁原理

編寫一個帶有輸入參數的存儲過程,參數為要顯示的數據的頁數,和要顯示的數據的行數,根據這個參數來檢索想要顯示的內容。
比如:
create proc GetData
@pagenum int,
@linenum int
as
select * from tablename
where rownum > ((@pagenum-1) * @linenum)
and rownum <= (@pagenum * @linenum)

exec GetData @pagenum = 1,@linenum = 50

不知道這個答案是不是你要的?

D. 求Mysql資料庫的翻頁存儲過程例子

這樣,我給你個私信,你看看,望採納哦

E. 怎樣用php+mysql存儲過程,並在php頁面里顯示首頁 第一頁 下一頁 末頁

class TViewPage
{
var $Table; //表名
var $MaxLine=15; //每頁顯示行數
var $Offset; //記錄偏移量
var $Total; //記錄總數
var $Number; //本頁讀取的記錄數
var $Result; //讀出的結果
var $TPages; //總頁數
var $CPages; //當前頁數
var $Condition; //資料庫搜索條件
var $PageQuery; //分頁顯示要傳遞的參數

var $strPageFrist = '首頁'; //設置導航條翻頁提示符
var $strPagePrev = '上頁';
var $strPageNext = '下頁';
var $strPageLast = '末頁';

var $strDispPageFrist; //設置導航條翻頁(未激活狀態)提示符
var $strDispPagePrev; //如果不設置,導航條將不區別顯示激活與否
var $strDispPageNext; //本項配合圖形可獲得最佳效果
var $strDispPageLast;

//******構造函數*************
//參數:表名、最大行數、偏移量
function TViewPage($TB,$ML,$OF)
{
$this->Table = $TB;
$this->MaxLine = $ML;
$this->Offset = (floor($OF/$ML)) * $ML;
}

//********設置顯示條件*********
//如:where id="$id" order by id desc
//要求是字串,符合SQL語法(本字串將加在SQL語句後)
function setCondition($s)
{
$this->Condition=$s;
}

//******設置傳遞參數************
// key參數名 value參數值
// 如:setpagequery("id",$id);如有多個參數要傳遞,可多次調用本函數
function setPageQuery($key,$value)
{
$tmp[key]=$key;$tmp[value]=$value;
$this->PageQuery[]=$tmp;
}

//********設置導航條分頁顯示的字元或圖形*********
//如:首頁 或 <IMG SRC=frist.gif ALIGN=absmiddle> 等。
//要求是字串,符合HTML語法顯示的要求
//如果不設置,導航條使用默認字元
function setPageFrist($s,$sd="")
{
$this->strPageFrist=$s;
$this->strDispPageFrist=$sd;
}
function setPagePrev($s,$sd="")
{
$this->strPagePrev=$s;
$this->strDispPagePrev=$sd;
}
function setPageNext($s,$sd="")
{
$this->strPageNext=$s;
$this->strDispPageNext=$sd;
}
function setPageLast($s,$sd="")
{
$this->strPageLast=$s;
$this->strDispPageNext=$sd;
}

//********讀取記錄***************
// 主要工作函數,根據所給的條件從表中讀取相應的記錄
// 返回值是一個二維數組,Result[記錄號][欄位名]
function getRecords()
{
$SQL="SELECT Count(*) AS total FROM ".$this->Table." ".$this->Condition;
$result=mysql_query($SQL) or die(mysql_error());
$row=mysql_fetch_Array($result);
........

+QQ 43054660 我可以幫你。。

F. (問題解決再追加100分)sql server存儲過程實現查詢數據條數過大,分頁查詢怎麼實現

按說5-8w這樣數量級的數據沒有問題,寫入Excel是布比較耗性能,主要還是要通過優化寫入Excel的代碼效率上去考慮。你可以考慮利用分批查詢寫入的方式來避免一次寫太多的數據到Excel:將你的查詢結果分段,比方你的語句中能不能用時間來認為分段,每次返回部分結果。
回到你的問題,對大數據量查詢的解決方案有以下兩種:
(1)、將全部數據先查詢到內存中,然後在內存中進行分頁,這種方式對內存佔用較大,必須限制一次查詢的數據量。
(2)、採用存儲過程在資料庫中進行分頁,這種方式對資料庫的依賴較大,不同的資料庫實現機制不通,並且查詢效率不夠理想。以上兩種方式對用戶來說都不夠友好。

2.解決思路
通過在待查詢的資料庫表上增加一個用於查詢的自增長欄位,然後採用該欄位進行分頁查詢,可以很好地解決這個問題。下面舉例說明這種分頁查詢方案。

(1)、在待查詢的表格上增加一個long型的自增長列,取名為「queryId」,mssql、sybase直接支持自增長欄位,oracle可以用sequence和trigger來實現。然後在該列上加上一個索引。
添加queryId列的語句如下:
Mssql: [QUERYID] [bigint] IDENTITY (1, 1)

Sybase: QUERYID numeric(19) identity

Oracle:
CREATE SEQUENCE queryId_S
INCREMENT BY 1
START WITH 1
MAXVALUE 999999999999999 MINVALUE 1
CYCLE
CACHE 20
ORDER;
CREATE OR REPLACE TRIGGER queryId_T BEFORE INSERT
ON "test_table"
FOR EACH ROW
BEGIN
select queryId_S.nextval into :new.queryId from al;
END;

(2)、在查詢第一頁時,先按照大小順序的倒序查出所有的queryId,
語句如下:select queryId from test_table where + 查詢條件 +order by queryId desc 。
因為只是查詢queryId欄位,即使表格中的數據量很大,該查詢也會很快得到結果。然後將得到的queryId保存在應用伺服器的一個數組中。

(3)、用戶在客戶端進行翻頁操作時,客戶端將待查詢的頁號作為參數傳遞給應用伺服器,伺服器通過頁號和queyId數組算出待查詢的queyId最大和最小值,然後進行查詢。

算出queyId最大和最小值的演算法如下,其中page為待查詢的頁號,pageSize為每頁的大小,queryIds為第二步生成的queryId數組:
int startRow = (page - 1) * pageSize
int endRow = page * pageSize - 1;
if (endRow >=queryIds.length)
{
endRow = this.queryIds.length - 1;
}
long startId =queryIds[startRow];
long endId =queryIds[endRow];

查詢語句如下:
String sql = "select * from test_table" + 查詢條件 + "(queryId <= " + startId + " and queryId >= " + endId + ")";

3.效果評價
該分頁查詢方法對所有資料庫都適用,對應用伺服器、資料庫伺服器、查詢客戶端的cpu和內存佔用都較低,查詢速度較快,是一個較為理想的分頁查詢實現方案。經過測試,查詢4百萬條數據,可以在3分鍾內顯示出首頁數據,以後每一次翻頁操作基本在2秒以內。內存和cpu佔用無明顯增長。

以上也僅僅是分頁查詢結果查看的問題,你需要寫入到Excel的話還需要考慮Excel寫入代碼的執行效率,這部分是很值得研究的。

G. 存儲過程分頁越往後越慢

在SQL2005裡面有一個專門支持分頁的函數,你使用一下呢.

select * from (select row_number()over(order by 排序的欄位)
as 自動序列,* from 表名) aa
where 自動序列>=2000000 and 自動序列 <2000100

我在5000萬的表中查詢,19S

H. 用存儲過程分頁後,前台上一頁,跳轉頁怎麼寫

頁面中用一個lable記錄當前存儲過程所使用的頁數,點擊 上一頁的時候lable的值-1,下一頁的時候lable的值+1,同時給存儲過程傳遞lable的值作為分頁存儲過程的一個參數(頁數),然後調用綁定數據函數.
頁面初始化的時候可以初始化lable的值為1,然後子(!ispostback)中調用綁定函數.
不知道清除否??

I. 表單post提交查詢資料庫調用存儲過程實現分頁功能

首先要知道分頁顯示數據需要哪些參數,包括總共有多少條數據的參數dataCount,每頁顯示多少條數據的參數pageSize,總共有多少頁數的參數pageCount,當前頁數(頁碼)的參數pageIndex。

獲取總共多少條數據的參數dataCount非常簡單,執行Sql語句「select count(*) from test」就可以拿到dataCount值了,還有一個非常簡單的參數就是當前頁數(頁碼)pageIndex默認就是1。
每頁顯示多少條數據根據網頁顯示量來設定,假設網頁一頁顯示10,那麼pageSize就是10,有dataCount和pageSize值,總共有多少頁數也就可以獲得了,pageCount=dataCount/pageSize,通過這樣計算頁數方式獲得的數據量一定小於實際的頁數,這里就需要用到取頂函數pageCount=1.0*dataCount/pageSize。

關鍵就是如何通過准備的參數獲取數據,還需要用到Sql Server2005及以上版本的資料庫才有的給資料庫表數據查詢時增加序號的函數,這是因為我們存放在資料庫的數據沒有連續自動增長的編號,藉助函數row_number()可以通過按某個欄位排序設定序號,方便獲取數據准確。
比較兩條Sql語句「select * from test」和「select *,row_number() over(order by Test1) as '序號' from Test」查詢數據進行比較就會發現在查詢結果中會增加一個通過欄位Test1排序而產生的一個序號,並且這個序號是連續自動增長的。

接下來創建存儲過程,指定參數就可以了。
create proc P_Test--創建存儲過程P_Test
@pageSize int,--每頁數據條數
@pageIndex int,--當前頁數(頁碼)
@pageCount int output--總的頁數,因為需要顯示頁數,因此是個輸出參數
as
declare @datacount int--總數據條數
select @datacount=count(*) from test--獲得總數據條數值並賦給參數
set @pageCount=ceiling(1.0*@datacount/@pageSize)--獲得總頁數,並賦給參數
--接下來是獲得指定頁數據
select * from
(select *,row_number() over(order by Test1) as num from test) as temp
where num between @pageSize*(@pageIndex-1)+1 and @pageSize*@pageIndex

J. 如何寫分頁存儲過程

create proc 電影存儲過程 --翻頁存儲過程
@PageSize int, --每頁面顯示數據條數
@PageIndex int, --頁面索引
@PageCount int output, --總頁數
@名稱 nvarchar(100)
as
--查詢范圍 (@PageSize*@PageIndex+1) 起始行
-- @PageSize*(@PageIndex+1) 結束行

select * from(select Row_Number() over (order by 影片ID) as id, * from(
select * from 電影 where 名稱 like '%'+@名稱+'%' or 主演 like '%'+@名稱+'%' )a )b where id between (@PageSize*@PageIndex+1) and @PageSize*(@PageIndex+1)

--得到數據行數
select @PageCount=count(1) from 電影 where 名稱 like '%'+@名稱+'%' or 主演 like '%'+@名稱+'%'
--計算出總行數
set @PageCount= (@PageCount-1)/@PageSize+1
print @PageCount

這個是我寫過的分頁存儲過程 給你參考下啊!

熱點內容
湖南回收伺服器主板雲主機 發布:2024-10-08 06:12:59 瀏覽:807
psv視頻腳本 發布:2024-10-08 06:12:13 瀏覽:420
文件夾菜單欄 發布:2024-10-08 05:46:23 瀏覽:491
壓縮機選型手冊 發布:2024-10-08 05:24:37 瀏覽:621
java主機名 發布:2024-10-08 05:12:55 瀏覽:118
華意壓縮待遇 發布:2024-10-08 05:04:07 瀏覽:466
jsp上傳圖片存到資料庫 發布:2024-10-08 05:04:06 瀏覽:74
分卷壓縮解壓速度 發布:2024-10-08 04:45:16 瀏覽:847
冰雪單職業輔助哪個好安卓 發布:2024-10-08 04:40:06 瀏覽:663
iqz3哪個配置好一點 發布:2024-10-08 04:34:07 瀏覽:763