SQL 2005通用分页存储过程

--  =============================================
--
 Description:    <SQL2005及后续版本通用分页存储过程>调用方法: sp_Pager2005 'xtest','*','ORDER BY ID ASC','xname like ''%222name%''',2,20,0,0
--
                    适合从单个表查询数据
--
 =============================================
ALTER  PROCEDURE  [ dbo ]. [ Proc_GetDataPaged_2005 ]
@tblName    varchar( 255),             --  表名如:'xtest'
@strGetFields  varchar( 1000=  ' * ',   --  需要返回的列如:'xname,xdemo'
@strOrder  varchar( 255) = '',           --  排序的字段名如:'order by id desc'
@strWhere   varchar( 1500=  '',       --  查询条件(注意:不要加where)如:'xname like ''%222name%''' 
@pageIndex  int = 1,                   -- 开始记录位置
@pageSize    int  =  20,                --  每页记录数如:20
@recordCount  int output,             --  记录总数
@doCount  bit = 0                         --  非0则统计,为0则不统计(统计会影响效率)
AS

declare  @strSQL  varchar( 5000)
declare  @strCount  nvarchar( 1000)
-- 总记录条数
if( @doCount != 0)
begin
     if( @strWhere  != '')
     begin
         set  @strCount = ' set @num=(select count(1) from  ' +  @tblName  +  '  where  ' + @strWhere + '  ) '
     end
     else
     begin
         set  @strCount = ' set @num=(select count(1) from  ' +  @tblName  +  '  ) '
     end
     EXECUTE sp_executesql  @strCount ,N ' @num INT output ', @RecordCount output
end

if  @strWhere  != ''
begin
     set  @strWhere = '  where  ' + @strWhere
end
set  @strSQL = ' SELECT * FROM (SELECT ROW_NUMBER() OVER ( ' + @strOrder + ' ) AS ROWID, '
set  @strSQL = @strSQL + @strGetFields + '  FROM [ ' + @tblName + ' ' + @strWhere
set  @strSQL = @strSQL + ' ) AS sp WHERE ROWID BETWEEN  ' + str(( @pageindex - 1) * @pagesize + 1)
set  @strSQL = @strSQL + '  AND  ' + str( @pageindex * @pagesize)

exec ( @strSQL)

你可能感兴趣的:(存储过程)