sql server 分頁儲存過程

2022-02-26 06:42:50 字數 6047 閱讀 9626

1樓:

create procedure pagination

@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)

as declare @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 + ']'

end--以上**的意思是如果@docount傳遞過來的不是0,就執行總數統計。以下的所有**都是@docount為0的情況

else

begin

if @ordertype != 0

begin

set @strtmp = '<(select min'

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

--如果@ordertype不是0,就執行降序,這句很重要!

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

--以下**賦予了@strsql以真正執行的sql**

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

endendexec (@strsql)

go/*

-- 需要傳遞的引數

@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)

-- 呼叫測試

exec pagination @tblname='jobs', @strgetfields='job_id,job_desc,min_lvl,max_lvl',

@fldname='job_id',@pagesize=3,@pageindex=1,

@docount=0,@ordertype=1,@strwhere=''

*/****************************************====

create proc sp_pagelist

@tbname sysname, --要分頁顯示的表名

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

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

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

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

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

--用於指定排序順序

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

@recordcount int output, --總記錄數

@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 @recordcount = @pagecount

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)

endendgo

關於儲存過程的as和is問題,建立儲存過程is和as有什麼區別

要是換bai 成duas就要改 zhi成下 dao面的專寫屬法 create procedure student updateasbegin update student set name null where id in select id from student where age 20 mi...

sql server中怎樣建立儲存資料的儲存過程

儲存什麼資料?如果是插入資料到表中 直接在儲存過程裡用insert into表就可以了 資料庫 可編輯性 儲存過程 新建儲存過程 儲存過程其實就是一些sql語句 特定的格式語句 條件控制語句 在sql server中,可以使用兩種方法建立儲存過程 利用sql server 管理平台建立儲存過程。使用...

sql2019兩個表聯合查詢分頁,不用儲存過程

select top n p w.d.from w left outer join d on w.idi d.did where d.number not in select top n 1 p d.number from w left outer join d on w.idi d.did ord...