今天在公司的项目中发现了个一个比较通用的存储过程,就此共享

 

CREATE PROCEDURE [dbo].[CustomPaging]
 @getFields NVARCHAR(500)='', --返回字段
 @tblName NVARCHAR(255)='', --表名
 @strWhere NVARCHAR(1500)='', --查询条件
 @strOrder NVARCHAR(1000)='',--排序字段
 @PageSize INT=10, --页尺寸
 @CurrentPage INT=1 --当前页码
AS
   
 DECLARE @strSQL NVARCHAR(4000) --主语句
 DEClARE @strTmp NVARCHAR(2000) --临时变量
 DECLARE @sRowNum INT --始记录行
 DEClARE @eRowNum INT --未记录行
 DECLARE @strCount NVARCHAR(4000) --查总的记录数
 
 DECLARE @Recordstr nvarchar(50)--记录条数
 DECLARE @RecordCount int
 DECLARE @CountPage int--总页数
 
 --设置查找
 IF @strWhere != ''
  SET @strWhere = ' WHERE ' + @strWhere
    --输出总记录
 SET @strSQL='set @RecordCount=(select count(*) from ' + @tblName + @strWhere+')'   
 EXEC sp_executesql @strSQL,N'@RecordCount int output',@RecordCount output
 

     SET @Recordstr= @RecordCount
 
 --取总页数
 IF @Recordstr%@PageSize=0 and @Recordstr>0
    SET @CountPage=@Recordstr/@PageSize
 ELSE
    SET @CountPage=@Recordstr/@PageSize+1
 
 --判断当前页是否超出范围 
 IF @CountPage<@CurrentPage
    SET @CurrentPage=@CountPage  --取当前页
 
 --设置页起始记录行值
 SET @sRowNum=(@CurrentPage-1)*@PageSize+1
 --设置页未记录行值
 SET @eRowNum=@sRowNum+@PageSize-1
 
 --设置排序
 IF (@strOrder !='')
  SET @strOrder = ' ORDER BY '+@strOrder
 ELSE
  SET @strOrder = ' ORDER BY ID'
 --设置总记录数 
 SET @strCount = 'SELECT '+@Recordstr+' AS Total '
 --设置总临时表
 SET @strTmp = '(SELECT ROW_NUMBER() OVER( '+@strOrder+' ) AS RowNum,'+ @getFields +
               ' FROM '+@tblName+ @strWhere +') AS t'
 --设置分页表
 --IF (@CurrentPage = 1)
  --SET @strSQL = 'SELECT TOP ('+ltrim(str(@PageSize))+') ROW_NUMBER() OVER('+@strOrder+' ) AS RowNum,'+@getFields+
     --  ' FROM '+ @tblName + @strWhere + @strOrder
  --SET @strSQL = 'SELECT TOP ('+ltrim(str(@PageSize))+') * from '+@strTmp
 --ELSE
  SET @strSQL =  'SELECT TOP ('+ltrim(str(@PageSize))+') *  FROM '+ @strTmp +
      ' WHERE RowNum BETWEEN '+ltrim(str(@sRowNum))+' AND '+ltrim(str(@eRowNum))+' order by rownum asc'
 --取得列表
 EXEC (@strSQL)
 --取得总记录数
 EXEC (@strCount)

 RETURN

此处有个函数挺有用得 就是产生序号  row_number over(order by yourfiled)

有表USERINFO   有column   name varchar(20)

可以如此  select row_number over(order by name) as ‘序号’,* from userInfo

显示:

序号   name

1        zhang

2        wang

3        lidddd

posted on 2009-05-18 15:03  冷傲残痕  阅读(190)  评论(0编辑  收藏  举报