SQL分頁儲存過程原始碼 百萬資料查詢毫秒不到

2021-06-09 00:45:51 字數 4778 閱讀 5844

/* 

@tbname         nvarchar(255),      --要分頁顯示的表名   注意:此處可以是表名,視,函式名

@fieldkey       nvarchar(255),      --用於定位記錄的主鍵(惟一鍵)字段,只能是單個字段  

@pagecurrent    int=1,              --要顯示的頁碼  

@pagesize       int=10,             --每頁的大小(記錄數)  

@fieldshow      nvarchar(1000),     --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段  

@fieldorder     nvarchar(1000),     --以逗號分隔的排序字段列表,可以指定在字段後面指定desc/asc  

--用於指定排序順序  

@where          nvarchar(1000),     --查詢條件  

@pagecount      int   output        --總頁數 

tbname這個引數是檢視名稱,也就是你必須要先建立乙個檢視,檢視裡獲取的資料集就是你真正要查詢的資料集了

這個檢視你可以進行多條連線,隨便你怎麼寫,只要是select就好。

那麼為什麼我們要用儲存過程來呼叫這個檢視呢,主要是為了傳引數給它。

fieldkey這個是主鍵,是必須的,也是唯一的索引,這樣我們才能獲取到正確的分頁資料,否則就是亂的。

pagecurrent 這個引數就是你需要獲取的,當前頁的頁碼了,比如,你需要第五頁,那我們就傳5

pagesize 這個引數是每頁顯示的條數,隨你喜歡。推薦10-25條,根據你的ui顯示需要。

fieldshow 這個是你要顯示的字段,這些視段是從檢視中提取的,所以名稱要與檢視的字段相同。如果不填寫預設提取的是所有的字段。如果是多個字段,那麼就用逗號分隔開,如id,username,address

fieldorder 這個是用來排序的,方法和sql排序方法是一樣的,但是我們傳的引數不帶order by,排序的物件是檢視出來的資料集

如:id desc,username asc

where引數是個比較關鍵的引數,該引數自帶where所以我們只需要傳條件,如 id=1 and username='a.z貓'

pagecount 是乙個output引數,即是這呼叫這個儲存過程後,除了返回給你你所要查詢的頁碼的資料集以外,還會返回你乙個pagecount的output引數,這個引數的值是一共分了多少頁,也就是總頁數。

*/ 

--set ansi_nulls on

--set quoted_identifier on

--go

----declare @tbname nvarchar(255) ,

--    @fieldkey nvarchar(255) ,

--    @pagecurrent int,

--    @pagesize int ,

--    @fieldshow nvarchar(1000) ,

--    @fieldorder nvarchar(1000) ,

--    @where nvarchar(1000) ,

--    @pagecount int

--    

--select @tbname='prd_jo_wip_hd',@fieldkey='stock_id',@pagecurrent=2,@pagesize=10

--select @where='',@fieldshow='*',@fieldorder='job_order_no'

--select @pagecount=null

alter proc [dbo].[cp_select_split_page_x]

@tbname nvarchar(255) ,

@fieldkey nvarchar(255) ,

@pagecurrent int = 1 ,

@pagesize int = 10 ,

@fieldshow nvarchar(1000) ,

@fieldorder nvarchar(1000) ,

@where nvarchar(1000) ,

@pagecount int output

asdeclare @sql nvarchar(4000)

set nocount on

--檢查物件是否有效

if object_id(@tbname) is null

begin

raiserror(n'物件"%s"不存在',1,16,@tbname)

return

endif objectproperty(object_id(@tbname) , n'istable') = 0 and objectproperty(object_id(@tbname) , n'isview') = 0 and objectproperty(object_id(@tbname) , n'istablefunction') = 0

begin

raiserror(n'"%s"不是表、檢視或者錶值函式',1,16,@tbname)

return

end

--分頁字段檢查

if isnull(@fieldkey , n'') = ''

begin

raiserror(n'分頁處理需要主鍵(或者惟一鍵)',1,16)

return

end

--其他引數檢查及規範

if isnull(@pagecurrent , 0) < 1

set @pagecurrent = 1

if isnull(@pagesize , 0) < 1

set @pagesize = 10

if isnull(@fieldshow , n'') = n''

set @fieldshow = n'*'

if isnull(@fieldorder , n'') = n''

set @fieldorder = n''

else

set @fieldorder = n'order by ' + ltrim(@fieldorder)

if isnull(@where , n'') = n''

set @where = n''

else

set @where = n'where (' + @where + n')'

--如果@pagecount為null值,則計算總頁數(這樣設計可以只在第一次計算總頁數,

--以後呼叫時,把總頁數傳回給儲存過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@pagecount賦值)

if @pagecount is null

begin

set @sql = n'select @pagecount=count(*)' + n' from ' + @tbname + n' ' + @where

exec sp_executesql @sql , n'@pagecount int output' , @pagecount output

set @pagecount = (@pagecount + @pagesize - 1) / @pagesize

end

--計算分頁顯示的topn值

declare @topn varchar(20) , @topn1 varchar(20)

select @topn = @pagesize , @topn1 = @pagecurrent * @pagesize

--第一頁直接顯示

if @pagecurrent = 1

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' '+@where

+n' '+@fieldorder)

else

begin

select @pagecurrent = @topn1 , @sql = n'select @n=@n-1,@s=case when @n<' + @topn + n' then @s+n'',''+quotename(rtrim(cast(' + @fieldkey + n' as varchar(8000))),n'''''''') else n'''' end from ' + @tbname + n' ' + @where + n' ' + @fieldorder

set rowcount @pagecurrent

exec sp_executesql @sql , n'@n int,@s nvarchar(4000) output' , @pagecurrent , @sql output

set rowcount 0

if @sql = n''

exec(n'select top 0' +n' '+@fieldshow +n' from '+@tbname)

else

begin

set @sql = stuff(@sql , 1 , 1 , n'')

--執行查詢

exec(n'select top '+@topn

+n' '+@fieldshow

+n' from '+@tbname

+n' where '+@fieldkey

+n' in('+@sql

+n') '+@fieldorder)

end

end

百萬級SQL分頁儲存過程

百萬級sql分頁儲存過程,請尊重原作者資訊.我只是更新一部分資料,原作者在分頁的處理過程中有一點錯誤.檢測了程式.發現並休正過來的.descript 分頁儲存過程 author blue.dream date 2004 8 18 21 01 update xqf222 date 18 11 2007...

sql 儲存過程分頁

create proc myx prpagerecordset querystr nvarchar 1000 keyfield nvarchar 200 pagesize int,pagenumber int as begin declare sqltext as nvarchar 4000 dec...

SQL 儲存過程 分頁

1.俄羅斯儲存過程 的改良版 create procedure pagination1 pagesize int,頁面大小,如每頁儲存20條記錄 pageindex int 當前頁碼 as set nocount on begin declare indextable table id int id...