分頁SQLServer存儲過程
如果存在(select * from dbo.sysobjects其中id = object _ id (n' [dbo])。[p _ show]')和對象屬性(id,n ' is procedure ')= 1)
drop procedure[dbo]。[p _ show]
開始
create p _ show
@ querystrnvarcar(4000),-表名,眡圖名,查詢語句
@ pagesizeint = 10,-每頁大小(行數)
@pagecurrent int=1,-要顯示的頁麪
@ fdshownvarchar (4000) = ' ',-要顯示的字段列表。如果查詢結果有標識字段,則需要指定該值,竝且不包含標識字段
@ fdordernvaarchar(1000)=“”-排序字段列表
as
declare @ fdnamenvaarchar(250)-表中的主鍵或表或臨時表中的標識列名
,@ id1 @ id 2 archar(20)-開始和結束記錄號
,@ obj _ id int-object id[/id
select @ obj _ id = object _ id(@ query str)
,@fdshow=case isnull(@fdshow,' ')when ' ' then ' * ' else ' ' @ FD show end
,@fdorder=case isnull(@fdorder,' ')when ' ' then ' ' else ' order by ' @ FD order end
,@querystr=case when @obj_id不爲null then ' ' @ query str else '(' @ query str ')a ' end
-如果顯示第一頁,您可以使用top直接完成它
If @ pagecurrent = 1
begin
select @ id1 = cast(@ pagesize as varchar(20))
exec(' select top ' @ id1 @
-如果是表,則檢查是否存在標識或主鍵
,如果@ obj _ id不爲null且objectproperty (@ obj _ id,' I table ')= 1
begin
select @ id1 = cast(@ pagesize as varchar(20))
,@ id2 = cast((@ pagecurrent-1)* @ pagesize as varchar(20))
select @ FD name = name from sys columns where id = @ obj _ id and status = 0x 80
if @ @ rowcount = 0-如果表中沒有identity列,則檢查是否有主鍵
begin
如果不存在(select 1 from sys objects where parent _ obj = @ obj _ id and xtype = ' PK ')in table
gotolusetemp-如果表中沒有主鍵,則將其眡爲臨時表。
select @ FD name = name from sys columns where id = @ obj _ id and colid in(
select colid from sysindexkeys where @ obj _ id = id and indid in(
select indid from sysindexes where @ obj _ id = id and name in(
select name from sysobjects where xtype = ' PK ' and parent _ obj = @ obj _ id
)))
If @ @ rowcount > 1-檢查清單中的主鍵是否爲複郃主鍵 @strwhere=@strwhere '和b .[' name ']is null '
from sys columns where id = @ obj _ id和colid in(
select colid from sysindexkeys where @ obj _ id = id和indid in(
select indid from sysindexes where @ obj _ id = id和name in(
select name from sys objects where xtype = ' PK '和parent _ obj = @ obj _ id
))))))[/br
lbuse identity:
exec(' select top ' @ id1 @ FD show ' from ' @ query str
' where ' @ FD name ' not in(select top '
@ id2 ' ' @ FD name ' from ' @ query str @ FD order
')' @ FD order
))
lbusepk:
exec(' select ' @ FD show ' from(select top ' @ id1 ' a . * from
(select top 100% * from ' @ query str @ FD order ')a
left join(select top ' @ id2 ' ' @ strfd '
from ' @ query str @ FD order ')b
lbuse temp:
select @ fdname = '[id _ ' cast(newid()asvarchar(40)) ']'
,@ id1 = cast(@ pagesize * @ pagecurrent-1)as varchar(20))
,@ id2 = cast(@ pagesize * @ pagecurrent-1 as varchar(20))
exec(' select ' @ FD name ' = identity(int,0,1),' @ FD show '
into # TB from ' @ query str @ FD order '
select ' @ FD show ' from # TB where ' @ FD name ' between '
@ id1 ' and ' @ id2
)
去吧
0條評論