MS Sql的乙個分頁儲存過程

2021-04-06 20:00:41 字數 3204 閱讀 2381

create procedure pagination3

@tblname varchar(255), -- 表名

@strgetfields varchar(1000) = "*", -- 需要返回的列

@fldname varchar(255)=" ", -- 排序的欄位名

@pagesize int = 10, -- 頁尺寸

@pageindex int = 1, -- 頁碼

@docount bit = 0, -- 返回記錄總數, 非 0 值則返回

@ordertype bit = 0, -- 設定排序型別, 非 0 值則降序

@strwhere varchar(1500) = " " -- 查詢條件 (注意: 不要加 where)

asdeclare @strsql varchar(5000) -- 主語句

declare @strtmp varchar(110) -- 臨時變數

declare @strorder varchar(400) -- 排序型別

if @docount != 0

begin

if @strwhere !=" "

set @strsql = "select count(*) as total from [" + @tblname + "] where "+@strwhere

else

set @strsql = "select count(*) as total from [" + @tblname + "]"

endelse

begin

if @ordertype != 0

begin

set @strtmp = "<(select min"

set @strorder = " order by [" + @fldname +"] desc"

endelse

begin

if @ordertype != 0

begin

set @strtmp = "<(select min"

set @strorder = " order by [" + @fldname +"] desc"

endelse

begin

set @strtmp = ">(select max"

set @strorder = " order by [" + @fldname +"] asc"

endif @pageindex = 1

begin

if @strwhere != " "

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ "

from [" + @tblname + "] where " + @strwhere + " " + @strorder

else

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ "

from ["+ @tblname + "] "+ @strorder

endelse

begin

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ " from ["

+ @tblname + "] where [" + @fldname + "]" + @strtmp + "(["+ @fldname + "])

from (select top " + str((@pageindex-1)*@pagesize) + " ["+ @fldname + "]

from [" + @tblname + "]" + @strorder + ") as tbltmp)"+ @strorder

if @strwhere != " "

set @strsql = "select top " + str(@pagesize) +" "+@strgetfields+ " from ["

+ @tblname + "] where [" + @fldname + "]" + @strtmp + "(["

+ @fldname + "]) from (select top " + str((@pageindex-1)*@pagesize) + " ["

+ @fldname + "] from [" + @tblname + "] where " + @strwhere + " "

+ @strorder + ") as tbltmp) and " + @strwhere + " " + @strorder

end

end

endexec (@strsql)

gounique clustered index

聚集索引有兩個最大的優勢:

1、以最快的速度縮小查詢範圍。

2、以最快的速度進行字段排序。

第1條多用在查詢優化時,而第2條多用在進行分頁時的資料排序。

而聚集索引在每個表內又只能建立乙個,這使得聚集索引顯得更加的重要。聚集索引的挑選可以說是實現「查詢優化」和「高效分頁」的最關鍵因素。

但要既使聚集索引列既符合查詢列的需要,又符合排序列的需要,這通常是乙個矛盾。筆者前面「索引」的討論中,將fariqi,即使用者發文日期作為了聚集索引的起始列,日期的精確度為「日」。這種作法的優點,前面已經提到了,在進行劃時間段的快速查詢中,比用id主鍵列有很大的優勢。

但在分頁時,由於這個聚集索引列存在著重覆記錄,所以無法使用max或min來最為分頁的參照物,進而無法實現更為高效的排序。而如果將id主鍵列作為聚集索引,那麼聚集索引除了用以排序之外,沒有任何用處,實際上是浪費了聚集索引這個寶貴的資源。

為解決這個矛盾,筆者後來又新增了乙個日期列,其預設值為getdate()。使用者在寫入記錄時,這個列自動寫入當時的時間,時間精確到毫秒。即使這樣,為了避免可能性很小的重合,還要在此列上建立unique約束。將此日期列作為聚集索引列。

有了這個時間型聚集索引列之後,使用者就既可以用這個列查詢使用者在插入資料時的某個時間段的查詢,又可以作為唯一列來實現max或min,成為分頁演算法的參照物。

經過這樣的優化,筆者發現,無論是大資料量的情況下還是小資料量的情況下,分頁速度一般都是幾十毫秒,甚至0毫秒。而用日期段縮小範圍的查詢速度比原來也沒有任何遲鈍。聚集索引是如此的重要和珍貴,所以筆者總結了一下,一定要將聚集索引建立在:

1、您最頻繁使用的、用以縮小查詢範圍的字段上;

2、您最頻繁使用的、需要排序的字段上。

乙個分頁儲存過程

page language c import namespace system.data import namespace system.data.sqlclient 訂單號 服務專案 預訂日期 操作人員 分配狀態 databinder.eval container.dataitem,offerid...

乙個分頁儲存過程

louje 分頁儲存過程 create procedure usp page pagesize int,頁大小 pageno int,頁號 tablename nvarchar 500 表名 keyword nvarchar 20 主鍵 fieldname nvarchar 2000 要顯示的欄位名...

乙個分頁儲存過程

create procedure sp page tb varchar 50 表名 col varchar 50 按該列來進行分頁 coltype int,col 列的型別,0 數字型別,1 字元型別,2 日期時間型別 orderby bit,排序,0 順序,1 倒序 collist varchar...