通用的分页存储过程
这个只要按照给定参数就可以实现分页效果,不过一次返回笔数是有调用者确定
![]()
Code
1
SET QUOTED_IDENTIFIER ON
2
GO
3
SET ANSI_NULLS ON
4
GO
5![]()
6![]()
7
ALTER PROCEDURE GetRecords
8
(@TableName varchar(15), ---表名
9
@KeyName varchar(30), ---key值欄位名
10
@ReturnFieldName varchar(300), ---返回欄位名集合
11
@Condition Varchar(1000), ---條件集合
12
@Order varchar(1000), ---排序集合
13
@RecordNum int, ---返回一頁的記錄數
14
@StartNO int, ---開始記錄數
15
@@RealNum INT OUTPUT, ---真實一頁返回筆數
16
@@TotalCount INT OUTPUT ) ---總共筆數
17
AS
18![]()
19
DECLARE @PreRecCount VARCHAR( 10 ) ---上次的筆數
20
DECLARE @CurRecCount VARCHAR( 10 ) ---當前的筆數
21![]()
22![]()
23
declare @ReturnTotal int ---回傳的總筆數
24
DECLARE @SQLStr NVARCHAR(500) ---回傳總筆數的SQL語句
25
set @SQLStr=N'SELECT @ReturnTotal=COUNT(*) FROM ' ---因為這個參數要求回傳所以處理不一樣,前者把變量寫在SQL語句中
26
set @SQLStr=@SQLStr+ @TableName +' WHERE 1=1 ' +@Condition ---直接讓變量轉化為值
27
exec sp_executesql @SQLStr,N'@ReturnTotal int output',
28
@ReturnTotal output
29
Set @@TotalCount=@ReturnTotal
30![]()
31
----返回該頁可以返回的真實筆數
32
IF @@TotalCount > ( @StartNO + 1 ) * @RecordNum
33
SET @@RealNum = @RecordNum
34
ELSE
35
SET @@RealNum = @@TotalCount - @StartNO * @RecordNum
36![]()
37
SET @CurRecCount = CAST( @StartNO * @RecordNum + @@RealNum AS VARCHAR( 10 ) )
38
IF @STARTNO = 0
39
EXEC( 'SELECT TOP ' + @RecordNum + @ReturnFieldName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order )
40
ELSE
41
BEGIN
42
SET @PreRecCount = CAST( @StartNO * @RecordNum AS VARCHAR( 10 ) )
43
EXEC( 'SELECT TOP ' + @RecordNum +' '+ @ReturnFieldName+ ' FROM '+@TableName+' WHERE 1=1 '+@Condition+' AND '+@KeyName+' NOT IN '
44
+ '(SELECT TOP ' + @PreRecCount + @KeyName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order+')' +' Order By '+@Order)
45
END
46![]()
47
print @PreRecCount
48
print @CurRecCount
49![]()
50
GO
51
SET QUOTED_IDENTIFIER OFF
52
GO
53
SET ANSI_NULLS ON
54
GO
55![]()
56
1
SET QUOTED_IDENTIFIER ON 2
GO3
SET ANSI_NULLS ON 4
GO5

6

7
ALTER PROCEDURE GetRecords 8
(@TableName varchar(15), ---表名9
@KeyName varchar(30), ---key值欄位名10
@ReturnFieldName varchar(300), ---返回欄位名集合11
@Condition Varchar(1000), ---條件集合12
@Order varchar(1000), ---排序集合13
@RecordNum int, ---返回一頁的記錄數14
@StartNO int, ---開始記錄數15
@@RealNum INT OUTPUT, ---真實一頁返回筆數16
@@TotalCount INT OUTPUT ) ---總共筆數17
AS18

19
DECLARE @PreRecCount VARCHAR( 10 ) ---上次的筆數20
DECLARE @CurRecCount VARCHAR( 10 ) ---當前的筆數21

22

23
declare @ReturnTotal int ---回傳的總筆數 24
DECLARE @SQLStr NVARCHAR(500) ---回傳總筆數的SQL語句25
set @SQLStr=N'SELECT @ReturnTotal=COUNT(*) FROM ' ---因為這個參數要求回傳所以處理不一樣,前者把變量寫在SQL語句中26
set @SQLStr=@SQLStr+ @TableName +' WHERE 1=1 ' +@Condition ---直接讓變量轉化為值27
exec sp_executesql @SQLStr,N'@ReturnTotal int output',28
@ReturnTotal output29
Set @@TotalCount=@ReturnTotal30

31
----返回該頁可以返回的真實筆數32
IF @@TotalCount > ( @StartNO + 1 ) * @RecordNum33
SET @@RealNum = @RecordNum 34
ELSE35
SET @@RealNum = @@TotalCount - @StartNO * @RecordNum36

37
SET @CurRecCount = CAST( @StartNO * @RecordNum + @@RealNum AS VARCHAR( 10 ) )38
IF @STARTNO = 039
EXEC( 'SELECT TOP ' + @RecordNum + @ReturnFieldName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order )40
ELSE41
BEGIN42
SET @PreRecCount = CAST( @StartNO * @RecordNum AS VARCHAR( 10 ) )43
EXEC( 'SELECT TOP ' + @RecordNum +' '+ @ReturnFieldName+ ' FROM '+@TableName+' WHERE 1=1 '+@Condition+' AND '+@KeyName+' NOT IN ' 44
+ '(SELECT TOP ' + @PreRecCount + @KeyName+' FROM '+@TableName+' WHERE 1=1 '+@Condition+' Order By '+@Order+')' +' Order By '+@Order) 45
END46

47
print @PreRecCount48
print @CurRecCount49

50
GO51
SET QUOTED_IDENTIFIER OFF 52
GO53
SET ANSI_NULLS ON 54
GO55

56


浙公网安备 33010602011771号