sql通用的存储过程

QUOTED_IDENTIFIER ON GO ALTER proc [dbo].[UpPagerSingle]

@ReturnFields Varchar(500)='*',--搜索表的字段,比如:’id,datatime,job‘,用逗号隔开

@TableName Varchar(30), --搜索的表名 @Where Varchar(1000)='',--搜索条件,这里不用写where,比如:job=’teacher‘and class='2'

@Orderfld Varchar(200)='', --排序,可以使用多字段排序但主键字段必需在最前面.也可以不写,比如:order by class asc @PageIndex int=1, --页号

@PageSize int=20 --每页显示数 as 

declare  @RecordCount int=0 declare @TmpSelect      NVarchar(max)  declare @Tmp     NVarchar(600) 

set nocount on--关闭计数

if @Where!='' set @TmpSelect = 'select @RecordCount = count(*) from '+@TableName+' where '+@Where

else

     set @TmpSelect='select @RecordCount=count(*) from '+@TableName+''

execute sp_executesql @TmpSelect,    --执行上面的sql语句 N'@RecordCount int OUTPUT' ,   --执行输出数据的sql语句,output出总记录数

@RecordCount  OUTPUT

       /*判断页数是否正确*/

if (@PageIndex - 1) * @PageSize > @RecordCount   --页号大于总页数,返回错误     

begin

if(@RecordCount%@PageSize)>0   

   set @PageIndex=@RecordCount/@PageSize+1

else   set @PageIndex=@RecordCount/@PageSize end set nocount off--打开计数

if @Where <> ''

   begin  

      set @TmpSelect = 'select * from (select row_number() over('+@Orderfld+' ) rn,'+@ReturnFields+' from ' +@TableName+' where '+@Where+')tb where rn >'  + convert(nvarchar(50),(@PageIndex-1)*@PageSize) +' and rn <= '+convert(nvarchar(50),@PageIndex*@PageSize)

   end

else

begin  

set @TmpSelect = 'select * from (select row_number() over('+@Orderfld+' ) rn,'+@ReturnFields+' from ' +@TableName+')tb where rn >'  + convert(nvarchar(50),(@PageIndex-1)*@PageSize) +' and rn <= '+convert(nvarchar(50),@PageIndex*@PageSize)

end

execute sp_executesql @TmpSelect

SELECT  @RecordCount As RecordCount

原文地址:https://www.cnblogs.com/qingtianoye/p/3307469.html