日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

      歡迎訪問 生活随笔!

      生活随笔

      當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

      编程问答

      各种 分页存储过程整理

      發布時間:2025/4/16 编程问答 40 豆豆
      生活随笔 收集整理的這篇文章主要介紹了 各种 分页存储过程整理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

      一、TOP n 實現的通用分頁存儲過程(轉自鄒建)

      CREATE PROC sp_PageView @tbname sysname, --要分頁顯示的表名 @FieldKey nvarchar(1000), --用于定位記錄的主鍵(惟一鍵)字段,可以是逗號分隔的多個字段 @PageCurrent int=1, --要顯示的頁碼 @PageSize int=10, --每頁的大小(記錄數) @FieldShow nvarchar(1000)='', --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段 @FieldOrder nvarchar(1000)='', --以逗號分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序順序 @Where nvarchar(1000)='', --查詢條件 @PageCount int OUTPUT --總頁數 AS SET NOCOUNT ON --檢查對象是否有效 IF OBJECT_ID(@tbname) IS NULL BEGINRAISERROR(N'對象"%s"不存在',1,16,@tbname)RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 BEGINRAISERROR(N'"%s"不是表、視圖或者表值函數',1,16,@tbname)RETURN END--分頁字段檢查 IF ISNULL(@FieldKey,N'')='' BEGINRAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',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'' ELSESET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder) IF ISNULL(@Where,N'')=N''SET @Where=N'' ELSESET @Where=N'WHERE ('+@Where+N')'--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以后調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對于不想計算總頁數的處理而言,可以給@PageCount賦值) IF @PageCount IS NULL BEGINDECLARE @sql nvarchar(4000)SET @sql=N'SELECT @PageCount=COUNT(*)'+N' FROM '+@tbname+N' '+@WhereEXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUTSET @PageCount=(@PageCount+@PageSize-1)/@PageSize END--計算分頁顯示的TOPN值 DECLARE @TopN varchar(20),@TopN1 varchar(20) SELECT @TopN=@PageSize,@TopN1=(@PageCurrent-1)*@PageSize--第一頁直接顯示 IF @PageCurrent=1EXEC(N'SELECT TOP '+@TopN+N' '+@FieldShow+N' FROM '+@tbname+N' '+@Where+N' '+@FieldOrder) ELSE BEGIN--處理別名IF @FieldShow=N'*'SET @FieldShow=N'a.*'--生成主鍵(惟一鍵)處理條件DECLARE @Where1 nvarchar(4000),@Where2 nvarchar(4000),@s nvarchar(1000),@Field sysnameSELECT @Where1=N'',@Where2=N'',@s=@FieldKeyWHILE CHARINDEX(N',',@s)>0SELECT @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=CASEWHEN @Where='' THEN N'WHERE ('ELSE @Where+N' AND ('END+N'b.'+@s+N' IS NULL'+@Where2+N')'--執行查詢EXEC(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) END

      ?


      二、字符串緩存實現的通用分頁存儲過程(轉自鄒建)

      CREATE PROC sp_PageView @tbname sysname, --要分頁顯示的表名 @FieldKey sysname, --用于定位記錄的主鍵(惟一鍵)字段,只能是單個字段 @PageCurrent int=1, --要顯示的頁碼 @PageSize int=10, --每頁的大小(記錄數) @FieldShow nvarchar(1000)='', --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段 @FieldOrder nvarchar(1000)='', --以逗號分隔的排序字段列表,可以指定在字段后面指定DESC/ASC 用于指定排序順序 @Where nvarchar(1000)='', --查詢條件 @PageCount int OUTPUT --總頁數 AS DECLARE @sql nvarchar(4000) SET NOCOUNT ON --檢查對象是否有效 IF OBJECT_ID(@tbname) IS NULL BEGINRAISERROR(N'對象"%s"不存在',1,16,@tbname)RETURN END IF OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTable')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsView')=0AND OBJECTPROPERTY(OBJECT_ID(@tbname),N'IsTableFunction')=0 BEGINRAISERROR(N'"%s"不是表、視圖或者表值函數',1,16,@tbname)RETURN END--分頁字段檢查 IF ISNULL(@FieldKey,N'')='' BEGINRAISERROR(N'分頁處理需要主鍵(或者惟一鍵)',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'' ELSESET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder) IF ISNULL(@Where,N'')=N''SET @Where=N'' ELSESET @Where=N'WHERE ('+@Where+N')'--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以后調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對于不想計算總頁數的處理而言,可以給@PageCount賦值) IF @PageCount IS NULL BEGINSET @sql=N'SELECT @PageCount=COUNT(*)'+N' FROM '+@tbname+N' '+@WhereEXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUTSET @PageCount=(@PageCount+@PageSize-1)/@PageSize END--計算分頁顯示的TOPN值 DECLARE @TopN varchar(20),@TopN1 varchar(20) SELECT @TopN=@PageSize,@TopN1=@PageCurrent*@PageSize --第一頁直接顯示 IF @PageCurrent=1EXEC(N'SELECT TOP '+@TopN+N' '+@FieldShow+N' FROM '+@tbname+N' '+@Where+N' '+@FieldOrder) ELSE BEGINSELECT @PageCurrent=@TopN1,@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<'+@TopN+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST('+@FieldKey+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM '+@tbname+N' '+@Where+N' '+@FieldOrderSET ROWCOUNT @PageCurrentEXEC sp_executesql @sql,N'@n int,@s nvarchar(4000) OUTPUT',@PageCurrent,@sql OUTPUTSET ROWCOUNT 0IF @sql=N''EXEC(N'SELECT TOP 0'+N' '+@FieldShow+N' FROM '+@tbname)ELSEBEGINSET @sql=STUFF(@sql,1,1,N'') --執行查詢EXEC(N'SELECT TOP '+@TopN+N' '+@FieldShow+N' FROM '+@tbname+N' WHERE '+@FieldKey+N' IN('+@sql+N') '+@FieldOrder)END END

      ?


      三、使用系統存儲過程實現的通用分頁存儲過程(轉自鄒建)

      CREATE PROC sp_PageView @sql ntext, --要執行的sql語句 @PageCurrent int=1, --要顯示的頁碼 @PageSize int=10, --每頁的大小 @PageCount int OUTPUT --總頁數 AS SET NOCOUNT ON DECLARE @p1 int --初始化分頁游標 EXEC sp_cursoropen@cursor=@p1 OUTPUT,@stmt=@sql,@scrollopt=1,@ccopt=1,@rowcount=@PageCount OUTPUT--計算總頁數 IF ISNULL(@PageSize,0)<1SET @PageSize=10 SET @PageCount=(@PageCount+@PageSize-1)/@PageSize IF ISNULL(@PageCurrent,0)<1 OR ISNULL(@PageCurrent,0)>@PageCountSET @PageCurrent=1 ELSESET @PageCurrent=(@PageCurrent-1)*@PageSize+1--顯示指定頁的數據 EXEC sp_cursorfetch @p1,16,@PageCurrent,@PageSize--關閉分頁游標 EXEC sp_cursorclose @p1

      ?


      四、SQL 2005的ROW_NUMBER()實現分頁功能

      DECLARE @pagenum AS INT, @pagesize AS INT SET @pagenum = 2 SET @pagesize = 3 SELECT * FROM (SELECT ROW_NUMBER() OVER(ORDER BY newsid DESC) AS rownum,newsid, topic, ntime, hitsFROM news) AS D WHERE rownum BETWEEN (@pagenum-1)*@pagesize+1 AND @pagenum*@pagesize ORDER BY newsid DESC

      ?

      五、使用內存表

      create proc Proc_paged (@pagesize int,@pagenum int,@pagecount int output ) as begin --聲明變量 declare @tmptable table(id int identity (1,1),userid nchar(5)) declare @idBengin int declare @idend int --構造內存表 insert into @tmptable (userid )(select userid from users) select @pagecount=count(*) from @tmptable if(@pagecount%@pagesize>0) set @pagecount=@pagecount/@pagesize+1 else set @pagecount=@pagecount/@pagesize set @idBengin=(@pagenum-1)*@pagesize set @idend=@idBengin+@pagesize select t2.id,t1.* from users t1,@tmptable t2 where t1.userid=t2.userid andt2.id>@idBengin and t2.id<=@idend end

      ?

      六、SQL 2005 版本 通用分頁存儲過程

      Create PROCEDURE [dbo].[Pagination] @Page int = 1, -- 當前頁碼 @PageSize int = 10, -- 每頁記錄條數(頁面大小) @Table nvarchar(500), -- 表名或視圖名,甚至可以是嵌套SQL:(Select * From Tab Where ID>1000) Tab @Field nvarchar(200) = '*', -- 返回記錄集字段名,","隔開,默認是"*" @OrderBy nvarchar(100) = 'ID ASC', -- 排序規則 @Filter nvarchar(500), -- 過濾條件 @MaxPage smallint output, -- 執行結果 -1 error, 0 false, maxpage true @TotalRow int output, -- 記錄總數 /* 2007-07-12 22:11:00 update */ @Descript varchar(100) output -- 結果描述 AS BEGIN Set ROWCOUNT @PageSize;Set @Descript = 'successful'; -------------------參數檢測---------------- IF LEN(RTRIM(LTRIM(@Table))) !> 0 BeginSet @MaxPage = 0;Set @Descript = 'table name is empty';Return; EndIF LEN(RTRIM(LTRIM(@OrderBy))) !> 0 BeginSet @MaxPage = 0;Set @Descript = 'order is empty';Return; EndIF ISNULL(@PageSize,0) <= 0 BeginSet @MaxPage = 0;Set @Descript = 'page size error';Return; EndIF ISNULL(@Page,0) <= 0 BeginSet @MaxPage = 0;Set @Descript = 'page error';Return; End -------------------檢測結束----------------Begin Try-- 整合SQLDeclare @SQL nvarchar(4000), @Portion nvarchar(4000);Set @Portion = ' ROW_NUMBER() OVER (ORDER BY ' + @OrderBy + ') AS ROWNUM FROM ' + @Table;Set @Portion = @Portion + (CASE WHEN LEN(@Filter) >= 1 THEN (' Where ' + @Filter + ') AS tab') ELSE (') AS tab') END);Set @SQL = 'Select TOP(' + CAST(@PageSize AS nvarchar(8)) + ') ' + @Field + ' FROM (Select ' + @Field + ',' + @Portion;Set @SQL = @SQL + ' Where tab.ROWNUM > ' + CAST((@Page-1)*@PageSize AS nvarchar(8));-- 執行SQL, 取當前頁記錄集Execute(@SQL);---------------------------------------------------------------------- 整合SQLSet @SQL = 'Set @Rows = (Select MAX(ROWNUM) FROM (Select' + @Portion + ')';-- 執行SQL, 取最大頁碼Execute sp_executesql @SQL, N'@Rows int output', @TotalRow output;Set @MaxPage = (CASE WHEN (@TotalRow % @PageSize)<>0 THEN (@TotalRow / @PageSize + 1) ELSE (@TotalRow / @PageSize) END); End Try Begin Catch-- 捕捉錯誤Set @MaxPage = -1;Set @Descript = 'error line: ' + CAST(ERROR_LINE() AS varchar(8)) + ', error number: ' + CAST(ERROR_NUMBER() AS varchar(8)) + ', error message: ' + ERROR_MESSAGE();Return; End Catch;-- 執行成功 Return; END

      ?

      整理自:http://www.cnblogs.com/onlytiancai/archive/2009/03/26/1421956.html

      轉載于:https://www.cnblogs.com/xufeiyang/articles/3245033.html

      總結

      以上是生活随笔為你收集整理的各种 分页存储过程整理的全部內容,希望文章能夠幫你解決所遇到的問題。

      如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。