这个只要按照给定参数就可以实现分页效果,不过一次返回笔数是有调用者确定

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