當前位置:編程學習大全網 - 編程語言 - 基於系統存儲過程sp_cursoropen ,sp_cursorfetch 和sp_cursorclose的存儲過程分頁效率高嗎?

基於系統存儲過程sp_cursoropen ,sp_cursorfetch 和sp_cursorclose的存儲過程分頁效率高嗎?

很耗資源,數據量大的時候效果很明顯!

如果要分頁,可以使用:

ALTER PROC sp_PageView --TOP n 實現的通用分頁存儲過程

@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

BEGIN

RAISERROR(N'對象"%s"不存在',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"不是表、視圖或者表值函數',1,16,@tbname)

RETURN

END

--分頁字段檢查

IF ISNULL(@FieldKey,N'')=''

BEGIN

RAISERROR(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''

ELSE

SET @FieldOrder=N'ORDER BY '+LTRIM(@FieldOrder)

IF ISNULL(@Where,N'')=N''

SET @Where=N''

ELSE

SET @Where=N'WHERE ('+@Where+N')'

--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第壹次計算總頁數,以後調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@PageCount賦值)

IF @PageCount IS NULL

BEGIN

DECLARE @sql nvarchar(4000)

SET @sql=N'SELECT @PageCount=COUNT(*)'

+N' FROM '+@tbname

+N' '+@Where

EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT

SET @PageCount=(@PageCount+@PageSize-1)/@PageSize

END

--計算分頁顯示的TOPN值

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'*'

SET @FieldShow=N'a.*'

--生成主鍵(惟壹鍵)處理條件

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')'

--執行查詢

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

/*

declare @PageCount int

exec sp_PageView

SA_Order,

iId,

5,

50,

'iId,dDate,cVouchId', --以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段

iId, --以逗號分隔的排序字段列表,可以指定在字段後面指定DESC/ASC 用於指定排序順序

'', --查詢條件

@PageCount

*/

GO

  • 上一篇:對所學軟件工程課程各部分內容的目的、作用、主要內容等進行總結,
  • 下一篇:sort、sorted排序技巧(多級排序)
  • copyright 2024編程學習大全網