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
