CREATE PROC sp_PageView
@tbname???? sysname,?????????? ?--要分頁顯示的表名
@FieldKey?? sysname,?????????? ?--用于定位記錄的主鍵(惟一鍵)字段,只能是單個字段
@PageCurrent int=1,???????????? ?--要顯示的頁碼
@PageSize?? int=10,??????????? ?--每頁的大小(記錄數)
@FieldShow? nvarchar(1000)='',? ?--以逗號分隔的要顯示的字段列表,如果不指定,則顯示所有字段
@FieldOrder? nvarchar(1000)='', ?--以逗號分隔的排序字段列表,可以指定在字段后面指定DESC/ASC
????????????????????????????????????????? 用于指定排序順序
@Where???? nvarchar(1000)='',? ?--查詢條件
@PageCount? int OUTPUT??????? ?--總頁數
AS
DECLARE @sql nvarchar(4000)
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(@Where,N'')=N''
?SET @Where=N''
ELSE
?SET @Where=N'WHERE (
'+@Where+N')'
--如果@PageCount為NULL值,則計算總頁數(這樣設計可以只在第一次計算總頁數,以后調用時,把總頁數傳回給存儲過程,避免再次計算總頁數,對于不想計算總頁數的處理而言,可以給@PageCount賦值)
IF @PageCount IS NULL
BEGIN
?SET @sql=N'SELECT @PageCount=COUNT(*)'
??+N' FROM
'+@tbname
??+N'
'+@Where
?EXEC sp_executesql @sql,N'@PageCount int OUTPUT',@PageCount OUTPUT
?SET @PageCount=(@PageCount+@PageSize-1)/@PageSize
END
--計算分頁顯示的TOPN值
DECLARE @TopN varchar(20),@TopN1 varchar(20)
SELECT @TopN=@PageSize,
?@TopN1=@PageCurrent*@PageSize?
--第一頁直接顯示
IF @PageCurrent=1
?EXEC(N'SELECT TOP
'+@TopN
??+N'
'+@FieldShow
??+N' FROM
'+@tbname
??+N'
'+@Where
??+N'
'+@FieldOrder
)
ELSE
BEGIN
?SELECT @PageCurrent=@TopN1,
??@sql=N'SELECT @n=@n-1,@s=CASE WHEN @n<
'+@TopN
???+N' THEN @s+N'',''+QUOTENAME(RTRIM(CAST(
'+@FieldKey
???+N' as varchar(8000))),N'''''''') ELSE N'''' END FROM
'+@tbname
???+N'
'+@Where
???+N'
'+@FieldOrder
?SET ROWCOUNT @PageCurrent
?EXEC sp_executesql @sql,
??
N'@n
int,@s nvarchar(4000) OUTPUT',
??@PageCurrent,@sql OUTPUT
?SET ROWCOUNT 0
?IF @sql=N''
??EXEC(N'SELECT TOP 0'
???+N'
'+@FieldShow
???+N' FROM
'+@tbname
)
?ELSE
?BEGIN
??SET @sql=STUFF(@sql,1,1,N'')??
??--執行查詢
??EXEC(N'SELECT TOP
'+@TopN
???+N'
'+@FieldShow
???+N' FROM
'+@tbname
???+N' WHERE
'+@FieldKey
???+N' IN(
'+@sql
???+N')
'+@FieldOrder
)
?END
END
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
