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

分頁存儲過程

發布時間: 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了。幹嘛自己寫?

熱點內容
eclipsejsp編譯 發布:2025-01-20 00:51:02 瀏覽:860
虛擬機連宿主機ftp 發布:2025-01-20 00:43:04 瀏覽:356
最小生成樹的prim演算法 發布:2025-01-20 00:39:40 瀏覽:325
淘寶助理無法上傳 發布:2025-01-20 00:34:33 瀏覽:883
如何做一個代理伺服器 發布:2025-01-20 00:18:39 瀏覽:803
android背單詞源碼 發布:2025-01-19 23:57:21 瀏覽:727
領動配置怎麼樣 發布:2025-01-19 23:56:35 瀏覽:83
python造數據 發布:2025-01-19 23:51:31 瀏覽:903
linux下卸載mysql 發布:2025-01-19 23:40:34 瀏覽:339
linuxweb路徑 發布:2025-01-19 23:25:08 瀏覽:941