主頁(yè) > 知識(shí)庫(kù) > SQL Server的通用分頁(yè)存儲(chǔ)過程 未使用游標(biāo),速度更快!

SQL Server的通用分頁(yè)存儲(chǔ)過程 未使用游標(biāo),速度更快!

熱門標(biāo)簽:蘭州語(yǔ)音外呼系統(tǒng)運(yùn)營(yíng)商 最新人工智能電銷機(jī)器人 銀川高頻外呼回?fù)芟到y(tǒng)多少錢 沒聽見電話機(jī)器人幫你接 如何做地圖標(biāo)注圖鋪 陜西電銷外呼系統(tǒng)好用嗎 成都電話外呼系統(tǒng)一般多少錢 數(shù)字匠心電銷機(jī)器人 al智能電話機(jī)器人

正常情況下,SQL Server服務(wù)器上會(huì)對(duì)使用頻率大的Table建立合適的索引
這樣能大幅度的提高數(shù)據(jù)庫(kù)本身的數(shù)據(jù)檢索速度,建立索引的方法就不細(xì)說了

如果需要返回大量數(shù)據(jù),從幾百行到幾萬行,甚至幾十萬行數(shù)據(jù)
這時(shí)會(huì)發(fā)現(xiàn)響應(yīng)速度越來越慢,甚至發(fā)生響應(yīng)超時(shí)的錯(cuò)誤
為了解決這種大數(shù)據(jù)量請(qǐng)求的問題,就不得不使用分頁(yè)模式了

在這方面,JDBC就強(qiáng)悍得多,它可以將指定的行數(shù)和SQL請(qǐng)求一并發(fā)送給SQL Server,這樣只返回分頁(yè)后的數(shù)據(jù),JDBC的原理還不清楚,但在實(shí)際使用中,速度還是非??斓?

如果沒辦法使用JDBC,最常用的方法就是存儲(chǔ)過程了!

我在寫這個(gè)分頁(yè)存儲(chǔ)之前,參考了網(wǎng)上的大量相關(guān)文章,可以通過關(guān)鍵字:SQL Server 分頁(yè) 進(jìn)行搜索
他們主要都是利用SQL中的Top方法,并且對(duì)所檢索的數(shù)據(jù)結(jié)構(gòu)要求有標(biāo)識(shí)列,如果沒有標(biāo)識(shí)列,或者是聯(lián)合主鍵,那么就會(huì)非常麻煩了。而且對(duì)應(yīng)用里原有的SQL檢索部分需要修改的地方較多,工作量較大。

因此,我在寫這個(gè)存儲(chǔ)之前就要求一定要對(duì)原有的SQL腳本最大程度的兼容

經(jīng)過一個(gè)下午的時(shí)間,和我一個(gè)同事(絕對(duì)是高手)的共同努力下,摸索出了以下的思路:

1、確定存儲(chǔ)的輸入?yún)?shù):
1)SQL腳本,該參數(shù)接收完整的、正確的SQL檢索文本,可將原應(yīng)用中寫好的SQL腳本直接傳入
2)每頁(yè)的數(shù)據(jù)容量,就是一頁(yè)有多少條數(shù)據(jù)
3)當(dāng)前頁(yè)碼
2、確定分頁(yè)機(jī)制:
1)執(zhí)行傳入的SQL腳本,并將結(jié)果生成臨時(shí)表
2)修改臨時(shí)表的結(jié)構(gòu),增加標(biāo)識(shí)列字段
3)根據(jù)標(biāo)識(shí)列字段,計(jì)算出指定頁(yè)碼內(nèi)的記錄范圍,并返回
4)返回總數(shù)據(jù)條數(shù),用于客戶端進(jìn)行分頁(yè)顯示

根據(jù)以上的思路,編寫出以下通用的分頁(yè)存儲(chǔ)過程:

復(fù)制代碼 代碼如下:

[code]
--// ============================
--// SQL Server通用分頁(yè)存儲(chǔ)過程
--// Author : netwild
--// date : 2010/07/22
--// Email : netwild@163.com
--// QQ : 52100641(網(wǎng)無忌)
--// ============================

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO


CREATE PROC execByPage

@sqlQuery varchar(2000), --//輸入?yún)?shù):SQL檢索語(yǔ)句或表名
@pageSize int, --//輸入?yún)?shù):每頁(yè)顯示記錄條數(shù)
@pageIndex int --//輸入?yún)?shù):當(dāng)前頁(yè)碼

AS

SET NOCOUNT ON
SET ANSI_WARNINGS OFF

declare @tmpTableName varchar(50)
set @tmpTableName = '##TB1516_' + replace(cast(newid() as varchar(40)),'-','') --//生成隨機(jī)臨時(shí)表名稱

declare @subIndex int
set @subIndex = charindex('from',@sqlQuery)
if (@subIndex > 0)
begin --//帶FROM的標(biāo)準(zhǔn)檢索語(yǔ)句
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) --//建立并初始化臨時(shí)表數(shù)據(jù)

declare @indexStart varchar(20),@indexEnd varchar(20)
set @indexStart = cast((@pageIndex-1)*@pageSize+1 as varchar(20)) --//數(shù)據(jù)起始行ID
set @indexEnd = cast(@pageIndex * @pageSize as varchar(20)) --//數(shù)據(jù)結(jié)束行ID

exec('select * from ' + @tmpTableName + ' where ID1516 between ' + @indexStart + ' and ' + @indexEnd) --//檢索該頁(yè)數(shù)據(jù)

exec('select max(ID1516) as recordCount from ' + @tmpTableName) --//提取總條數(shù)

exec('drop table ' + @tmpTableName) --//刪除臨時(shí)表


GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

[/code]

您可能感興趣的文章:
  • nodejs分頁(yè)類代碼分享
  • nodejs個(gè)人博客開發(fā)第六步 數(shù)據(jù)分頁(yè)
  • JDBC使用游標(biāo)實(shí)現(xiàn)分頁(yè)查詢的方法
  • 基于游標(biāo)的分頁(yè)接口實(shí)現(xiàn)代碼示例

標(biāo)簽:朔州 鹽城 遼源 本溪 通化 邢臺(tái) 巴彥淖爾 宜春

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《SQL Server的通用分頁(yè)存儲(chǔ)過程 未使用游標(biāo),速度更快!》,本文關(guān)鍵詞  SQL,Server,的,通用,分頁(yè),存儲(chǔ),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《SQL Server的通用分頁(yè)存儲(chǔ)過程 未使用游標(biāo),速度更快!》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于SQL Server的通用分頁(yè)存儲(chǔ)過程 未使用游標(biāo),速度更快!的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章