sql200
set
ANSI_NULLS
ON
set
QUOTED_IDENTIFIER
ON
go
ALTER
PROC
[
dbo
]
.
[
PROCE_PageView2000
]
(
@tbname
nvarchar
(
100
),
--
要分頁顯示的表名
@FieldKey
nvarchar
(
1000
),
--
用於定位記錄的主鍵(惟一鍵)字段,可以是逗號分隔的多個字段
@PageCurrent
int
=
1
,
--
要顯示的頁碼
@PageSize
int
=
10
,
--
每頁的大小(記錄數)
@FieldShow
nvarchar
(
1000
)
=
''
,
--
以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段
@FieldOrder
nvarchar
(
1000
)
=
''
,
--
以逗號分隔的排序字段列表,可以指定在字段後面指定DESC/ASC
@WhereString
nvarchar
(
1000
)
=
N
''
,
--
查詢條件
@RecordCount
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
(
@WhereString
,N
''
)
=
N
''
SET
@WhereString
=
N
''
ELSE
SET
@WhereString
=
N
'
WHERE (
'
+
@WhereString
+
N
'
)
'
--
如果@RecordCount爲NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以後調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對於不想計算總頁數的處理而言,可以給@RecordCount賦值)
IF
@RecordCount
IS
NULL
BEGIN
DECLARE
@sql
nvarchar
(
4000
)
SET
@sql
=
N
'
SELECT @RecordCount=COUNT(*)
'
+
N
'
FROM
'
+
@tbname
+
N
'
'
+
@WhereString
EXEC
sp_executesql
@sql
,N
'
@RecordCount int OUTPUT
'
,
@RecordCount
OUTPUT
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
'
'
+
@WhereString
+
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
'
,
@WhereString
=
REPLACE
(
@WhereString
,
@Field
,N
'
a.
'
+
@Field
),
@FieldOrder
=
REPLACE
(
@FieldOrder
,
@Field
,N
'
a.
'
+
@Field
),
@FieldShow
=
REPLACE
(
@FieldShow
,
@Field
,N
'
a.
'
+
@Field
)
SELECT
@WhereString
=
REPLACE
(
@WhereString
,
@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
@WhereString
=
''
THEN
N
'
WHERE (
'
ELSE
@WhereString
+
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
'
+
@WhereString
+
N
'
'
+
@FieldOrder
+
N
'
)b ON
'
+
@Where1
+
N
'
'
+
@Where2
+
N
'
'
+
@FieldOrder
)
END
sql2005
set
ANSI_NULLS
ON
set
QUOTED_IDENTIFIER
ON
go
ALTER
PROCEDURE
[
dbo
]
.
[
PROCE_SQL2005PAGECHANGE
]
(
@TableName
varchar
(
50
),
--
表名
@ReFieldsStr
varchar
(
200
)
=
'
*
'
,
--
字段名(全部字段爲*)
@OrderString
varchar
(
200
),
--
排序字段(必須!支持多字段不用加order by)
@WhereString
varchar
(
500
)
=
N
''
,
--
條件語句(不用加where)
@PageSize
int
,
--
每頁多少條記錄
@PageIndex
int
=
1
,
--
指定當前爲第幾頁
@TotalRecord
int
output
--
返回總記錄數
)
AS
BEGIN
--
處理開始點和結束點
Declare
@StartRecord
int
;
Declare
@EndRecord
int
;
Declare
@TotalCountSql
nvarchar
(
500
);
Declare
@SqlString
nvarchar
(
2000
);
set
@StartRecord
=
(
@PageIndex
-
1
)
*
@PageSize
+
1
set
@EndRecord
=
@StartRecord
+
@PageSize
-
1
SET
@TotalCountSql
=
N
'
select @TotalRecord = count(*) from
'
+
@TableName
;
--
總記錄數語句
SET
@SqlString
=
N
'
(select row_number() over (order by
'
+
@OrderString
+
'
) as rowId,
'
+
@ReFieldsStr
+
'
from
'
+
@TableName
;
--
查詢語句
--
IF
(
@WhereString
!
=
''
or
@WhereString
!=
null
)
BEGIN
SET
@TotalCountSql
=
@TotalCountSql
+
'
where
'
+
@WhereString
;
SET
@SqlString
=
@SqlString
+
'
where
'
+
@WhereString
;
END
--
第一次執行得到
--
IF(@TotalRecord is null)
--
BEGIN
EXEC
sp_executesql
@totalCountSql
,N
'
@TotalRecord int out
'
,
@TotalRecord
output;
--
返回總記錄數
--
END
--
--執行主語句
set
@SqlString
=
'
select * from
'
+
@SqlString
+
'
) as t where rowId between
'
+
ltrim
(
str
(
@StartRecord
))
+
'
and
'
+
ltrim
(
str
(
@EndRecord
));
Exec
(
@SqlString
)
END