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)
posted @ 2011-10-26 10:59  Rex.He  阅读(429)  评论(0编辑  收藏  举报