分页存储过程

create PROC [dbo].[sp_PageView]
   @tbname     sysname,               
   @FieldKey   nvarchar(1000),      
   @PageCurrent int=1,              
   @PageSize   int=10,                
   @FieldShow nvarchar(1000)='',      
   @FieldOrder nvarchar(1000)='',      
  @Where    nvarchar(1000)='',     
  @ItemCount int OUTPUT,
  @PageCount int OUTPUT            
  AS
  SET NOCOUNT ON

  IF OBJECT_ID(@tbname) IS NULL
  BEGIN
      RAISERROR(N'table "%s" is not exists',1,16,@tbname)
      RETURN
  END
  IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0
      AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0
      AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0
  BEGIN
      RAISERROR(N'"%s" is not table or view',1,16,@tbname)
      RETURN
  END
  IF ISNULL(@FieldKey,N'')=''
  BEGIN
      RAISERROR(N'page view must primary key',1,16)
      RETURN
  END
  IF ISNULL(@PageCurrent,0)<1 SET @PageCurrent=1
  IF ISNULL(@PageSize,0)<1 SET @PageSize=10
  IF ISNULL(@FieldShow,N'')=N'' SET @FieldShow=N'*'
  IF ISNULL(@FieldOrder,N'')=N''
      SET @FieldOrder=N''
  ELSE
      SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)
  IF ISNULL(@Where,N'')=N''
      SET @Where=N''
  ELSE
      SET @Where=N'WHERE ('+@Where+N')'
 
      DECLARE @sql nvarchar(4000)
      SET @sql=N'SELECT @ItemCount=COUNT(*)'
          +N' FROM '+@tbname
          +N' '+@Where
      EXEC sp_executesql @sql,N'@ItemCount int OUTPUT',@ItemCount OUTPUT
      SET @PageCount=(@ItemCount+@PageSize-1)/@PageSize
 
 print @PageCount
 print @ItemCount

 DECLARE @TopN varchar(20),@TopN1 varchar(20)
 SELECT @TopN=@PageSize,
      @TopN1=(@PageCurrent-1)*@PageSize

 IF @PageCurrent=1
      EXEC(N'SELECT TOP '+@TopN
          +N' '+@FieldShow
          +N' FROM '+@tbname
          +N' '+@Where
          +N' '+@FieldOrder)
 ELSE
 BEGIN
      IF @FieldShow=N'*'
      DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),
          @s nvarchar(1000),@Field sysname
      SELECT @Where1=N'',@Where2=N'',@s=@FieldKey
      WHILE CHARINDEX(N',',@s)>0
          SELECT @Field=LEFT(@s,CHARINDEX(N',',@s)-1),
              @s=STUFF(@s,1,CHARINDEX(N',',@s),N''),
              @Where1=@Where1+N' AND a.'+@Field+N'=b.'+@Field,
              @Where2=@Where2+N' AND b.'+@Field+N' IS NULL',
              --@Where=REPLACE(@Where,@Field,N'a.'+@Field),
              @FieldOrder=REPLACE(@FieldOrder,@Field,N'a.'+@Field),
              @FieldShow=REPLACE(@FieldShow,@Field,N'a.'+@Field)
      SELECT --@Where=REPLACE(@Where,@s,N'a.'+@s),
         @FieldOrder=REPLACE(@FieldOrder,@s,N'a.'+@s),
         @FieldShow=REPLACE(@FieldShow,@s,N'a.'+@s),
          @Where1=STUFF(@Where1+N' AND a.'+@s+N'=b.'+@s,1,5,N''),    
         @Where2=CASE
             WHEN @Where='' THEN N'WHERE ('
             ELSE @Where+N' AND ('
             END+N'b.'+@s+N' IS NULL'+@Where2+N')'
     DECLARE @QUERYSTRING varchar(2000)
     SET @QUERYSTRING =     N'SELECT TOP '+@TopN
         +N' '+@FieldShow
         +N' FROM '+@tbname
         +N' a LEFT JOIN(SELECT TOP '+@TopN1
         +N' '+@FieldKey
         +N' FROM '+@tbname
         +N' a '+@Where
         +N' '+@FieldOrder
        +N')b ON '+@Where1
        +N' '+@Where2
        +N' '+@FieldOrder
    PRINT @QUERYSTRING    
    EXEC(@QUERYSTRING)
END

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