天天看點

sql 2005 分頁存儲過程

sql 2005 分頁存儲過程

set ansi_nulls on

set quoted_identifier on

go

-- [selectbase] 1,1,'users','username=''test'''

alter procedure [dbo].[selectbase]

@pageindex                    int,

@pagesize                    int,

@tablename       nvarchar(max),

@where                     nvarchar(max)=''

as

declare @rowcount          int

declare @intstart          int

declare @intend         int

declare @sql nvarchar(max), @wherer nvarchar(max), @orderby nvarchar(max)

set @rowcount=0

set nocount on

if @where<>''

begin

  set @where=' and '+@where

end

if charindex('order by', @where)>0

    set @wherer=substring(@where, 1, charindex('order by',@where)-1)    --取得條件

    set @orderby=substring(@where, charindex('order by',@where), len(@where))    --取得排序方式(order by 字段 方式)

else

    set @wherer=@where

    declare @pkname nvarchar(50)

    if(len(@tablename)>50)

    begin

        set @pkname='id'

    end

    else

        select top 1 @pkname=[name] from syscolumns where id=object_id(@tablename) order by colstat desc

    set @orderby=' order by '+@pkname+' asc'

set @sql='select @rowcount=count(*) from '+cast(@tablename as nvarchar(3000))+' where 1=1 '+@wherer

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

if @pageindex=0 and @pagesize=0    --不進行分頁,查詢所有資料清單

    set @sql='select * from '+cast(@tablename as nvarchar(3000))+' where 1=1 '+@where

else    --進行分頁查詢資料清單

    set @intstart=(@pageindex-1)*@pagesize+1;

    set @intend=@intstart+@pagesize-1

    set @sql='select * from(select *,row_number() over('+cast(@orderby as nvarchar)+') as row from '

    set @sql=@sql+@tablename+' where 1=1 '+@wherer+') as a where row between '+cast(@intstart as varchar)+' and '+cast(@intend as varchar)

--print @sql

exec sp_executesql @sql

--select @rowcount

return @rowcount

--------------------------------------------

--exec [selectbase] 1,8,'spacecontent','userinfoid=45'

set nocount off

sql 2005 分頁存儲過程