01
set ANSI_NULLS ON
02
set QUOTED_IDENTIFIER ON
03
go
04
05
/*
06
功能描述: 通用分頁顯示查詢
07
如果有自增標識字段,在@strGetFIElds中不要加入此字段信息,
08
如果非要加入的話,要 (fldName + 0) AS fldName 這樣處理;
09
輸入參數:
10
@tblName: 表名
11
@strGetFIElds: 需要返回的列 '*':返回所以列信息
12
@PageSize: 頁尺寸
13
@PageIndex: 頁碼
14
@doCount: 返回記錄總數, 非 0 值則返回
15
@strOrderBy: 排序字段信息,(注意: 不要加 ORDER BY)
16
格式: FIEld1 DESC, FIEld2 ASC
17
@strWhere: 查詢條件,(注意: 不要加 WHERE)
18
輸出參數: @RecordCount: 記錄總數
19
作 者: Nestcn
20
創建時間: 2010-03-09
21
更改紀錄:
22
*/
23
ALTER PROCEDURE [dbo].[MyPagination]
24
(
25
@tblName varchar(255),
26
@strGetFIElds varchar(1000) = '*',
27
@PageSize int = 10,
28
@PageIndex int = 1,
29
@doCount bit = 0,
30
@strOrderBy varchar(500) = '',
31
@strWhere varchar(1500) = '',
32
@RecordCount int output
33
)
34
AS
35
-- 主語句
36
DECLARE @strSQL varchar(5000) SET @strSQL = ''
37
-- 排序變量
38
DECLARE @strOrder varchar(400) SET @strOrder = ''
39
40
SET @RecordCount = 0
41
--如果@doCount傳遞過來的不是0,就執行總數統計
42
IF (@doCount != 0)
43
BEGIN
44
DECLARE @sWhere varchar(2000)
45
46
SET @sWhere = ''
47
IF (@strWhere != '')
48
SET @sWhere = ' WHERE ' + @strWhere
49
50
SET @strSQL = 'if exists (select * from dbo.sysobjects where id = object_id(''[dbo].[tmpTable]'') and OBJECTPROPERTY(id, ''IsUserTable'') = 1) '
51
SET @strSQL = @strSQL + ' UPDATE tmpTable SET Total = (SELECT COUNT(*) FROM [' + @tblName + '] ' + @sWhere + ') '
52
SET @strSQL = @strSQL + ' ELSE SELECT COUNT(*) AS Total INTO tmpTable FROM [' + @tblName + '] ' + @sWhere
53
54
EXEC (@strSQL)
55
56
SELECT @RecordCount=Total FROM tmpTable
57
58
--刪除總數統計臨時表
59
EXEC ('DROP TABLE tmpTable')
60
END
61
62
PRINT @RecordCount
63
64
--排序字段信息
65
IF (@strOrderBy != '')
66
SET @strOrder = ' ORDER BY ' + @strOrderBy
67
--如果是第一頁就執行以上代碼,這樣會加快執行速度
68
IF (@PageIndex = 1)
69
BEGIN
70
IF (@strWhere != '')
71
SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFIElds + ' FROM [' + @tblName + '] WHERE ' + @strWhere + @strOrder
72
ELSE
73
SET @strSQL = 'SELECT TOP ' + str(@PageSize) + ' ' + @strGetFIElds + ' FROM ['+ @tblName + '] '+ @strOrder
74
END
75
ELSE
76
BEGIN
77
--為搜索表建立自動編號 保存到臨時表中
78
SET @strSQL = 'SELECT TOP ' + str(@PageIndex*@PageSize) + ' IDENTITY(int,1,1) AS IID, ' + @strGetFIElds + ' INTO #tmpTable FROM [' + @tblName + ']'
79
IF (@strWhere != '')
80
SET @strSQL = @strSQL + ' WHERE ' + @strWhere + @strOrder
81
ELSE
82
SET @strSQL = @strSQL + @strOrder
83
84
--以下代碼賦予了@strSQL以真正執行的SQL代碼
85
SET @strSQL = @strSQL + ' SELECT ' + @strGetFIElds + ' FROM #tmpTable WHERE IID > ' + str((@PageIndex-1)*@PageSize) + ' DROP TABLE #tmpTable'
86
END
87
88
PRINT @strSQL
89
90
--執行分頁查詢
91
EXEC (@strSQL)