SQL Server的通用分頁存儲進程 未應用游標,速度更快!。本站提示廣大學習愛好者:(SQL Server的通用分頁存儲進程 未應用游標,速度更快!)文章只能為提供參考,不一定能成為您想要的結果。以下是SQL Server的通用分頁存儲進程 未應用游標,速度更快!正文
正常情形下,SQL Server辦事器上會對應用頻率年夜的Table樹立適合的索引
如許能年夜幅度的進步數據庫自己的數據檢索速度,樹立索引的辦法就不細說了
假如須要前往年夜量數據,從幾百行到幾萬行,乃至幾十萬行數據
這時候會發明呼應速度愈來愈慢,乃至產生呼應超時的毛病
為懂得決這類年夜數據量要求的成績,就不能不應用分頁形式了
在這方面,JDBC就強悍很多,它可以將指定的行數和SQL要求一並發送給SQL Server,如許只前往分頁後的數據,JDBC的道理還不清晰,但在現實應用中,速度照樣異常快的
假如沒方法應用JDBC,最經常使用的辦法就是存儲進程了!
我在寫這個分頁存儲之前,參考了網上的年夜量相干文章,可以經由過程症結字:SQL Server 分頁 停止搜刮
他們重要都是應用SQL中的Top辦法,而且對所檢索的數據構造請求有標識列,假如沒有標識列,或許是結合主鍵,那末就會異常費事了。並且對運用裡原本的SQL檢索部門須要修正的處所較多,任務量較年夜。
是以,我在寫這個存儲之前就請求必定要對原本的SQL劇本最年夜水平的兼容
經由一個下晝的時光,和我一個同事(相對是高手)的配合盡力下,探索出了以下的思緒:
1、肯定存儲的輸出參數:
1)SQL劇本,該參數吸收完全的、准確的SQL檢索文本,可將原運用中寫好的SQL劇本直接傳入
2)每頁的數據容量,就是一頁有若干條數據
3)以後頁碼
2、肯定分頁機制:
1)履行傳入的SQL劇本,並將成果生成暫時表
2)修正暫時表的構造,增長標識列字段
3)依據標識列字段,盤算出指定頁碼內的記載規模,並前往
4)前往總數據條數,用於客戶端停止分頁顯示
依據以上的思緒,編寫出以下通用的分頁存儲進程:
[code]
--// ============================
--// SQL Server通用分頁存儲進程
--// Author : netwild
--// date : 2010/07/22
--// Email : [email protected]
--// QQ : 52100641(網無忌)
--// ============================
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO
CREATE PROC execByPage
@sqlQuery varchar(2000), --//輸出參數:SQL檢索語句或表名
@pageSize int, --//輸出參數:每頁顯示記載條數
@pageIndex int --//輸出參數:以後頁碼
AS
SET NOCOUNT ON
SET ANSI_WARNINGS OFF
declare @tmpTableName varchar(50)
set @tmpTableName = '##TB1516_' + replace(cast(newid() as varchar(40)),'-','') --//生成隨機暫時表稱號
declare @subIndex int
set @subIndex = charindex('from',@sqlQuery)
if (@subIndex > 0)
begin --//帶FROM的尺度檢索語句
declare @sqlQuery1 varchar(2000)
declare @sqlQuery2 varchar(2000)
set @sqlQuery1 = substring(@sqlQuery,1,@subIndex - 1)
set @sqlQuery2 = substring(@sqlQuery,@subIndex,len(@sqlQuery))
set @sqlQuery = @sqlQuery1 + ',IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' ' + @sqlQuery2
end
else --//不帶FROM的表名
begin
set @sqlQuery = 'select *,IDENTITY(numeric,1,1) as ID1516 into ' + @tmpTableName + ' from' + @sqlQuery
end
exec(@sqlQuery) --//樹立並初始化暫時表數據
declare @indexStart varchar(20),@indexEnd varchar(20)
set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) --//數據肇端行ID
set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) --//數據停止行ID
exec('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd) --//檢索該頁數據
exec('select max(ID1516) as recordCount from ' + @tmpTableName) --//提取總條數
exec('drop table ' + @tmpTableName) --//刪除暫時表
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO
[/code]