程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> 其他數據庫知識 >> MSSQL >> SQL Server的通用分頁存儲進程 未應用游標,速度更快!

SQL Server的通用分頁存儲進程 未應用游標,速度更快!

編輯:MSSQL

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]

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved