--名稱:分頁存儲過程(sql2000通用型)
--使用示例
-- Declare @start int
-- EXEC dbo.sp_page '*','s_admin where iid>=7','order by logintimes desc',30,1, @start out
-- print @start
--注意
--目前還沒有對輸入的參數(shù)進(jìn)行嚴(yán)格的驗(yàn)證
--默認(rèn)為輸入都是合法有效的
ALTER PROCEDURE dbo.sp_page
(
@fields varchar(800) --SELECT 后面 FROM 前面 的 字段 不用包含SELECT
,@sqlFrom varchar(800) --FROM 后面 的 字段 不包含F(xiàn)ROM
,@sqlOrderBy varchar(800) -- Order By 后面的字符,包括Order By
,@pageSize int -- 每頁數(shù)據(jù)行數(shù)
,@pageIndex int --要轉(zhuǎn)到的頁碼
,@records int OUTPUT -- 當(dāng)前查詢條件下的總記錄數(shù)
)
AS
BEGIN
Declare @sqlStr nvarchar(800)
-- 取得總記錄數(shù)
set @sqlStr='select @records = count(*) from ' + @sqlFrom
--執(zhí)行@sql中的語句
exec sp_executesql @sqlStr
,N'@records varchar(1000) out' --表示@sqlStr中的語句包含了一個輸出參數(shù)
,@records out --和調(diào)用存儲過程差不多,指定輸出參數(shù)值
-- 根據(jù)每頁數(shù)據(jù)行數(shù) 和 要轉(zhuǎn)到的頁碼 得到 數(shù)據(jù)起止點(diǎn)
Declare @start int
Declare @end int
set @end = @pageSize * @pageIndex
set @start = @pageSize * (@pageIndex - 1) + 1
-- 臨時表名稱 可隨機(jī)命名
Declare @tmpTable varchar(12)
SET @tmpTable ='#tmp'+ left(newid(),8)
-- 創(chuàng)建數(shù)據(jù)源到臨時表
SELECT @sqlStr = 'SELECT Identity(int,1,1) AS RowIndex, * INTO '+ @tmpTable
SELECT @sqlStr = @sqlStr + ' FROM (SELECT TOP ' + Convert(char,@end )+ @fields + ' FROM ' + rtrim(@sqlFrom) + ' '+ rtrim(@sqlOrderBy) + ') A'
-- 查詢臨時表 得到所需要的數(shù)據(jù)
SELECT @sqlStr = @sqlStr + ' '+'SELECT '+ rtrim(@fields) +' FROM ' + @tmpTable
SELECT @sqlStr = @sqlStr + ' WHERE RowIndex BETWEEN ' + Convert(char,@start) + ' AND ' + Convert(char,@end)
-- 刪除臨時表
SELECT @sqlStr = @sqlStr + ' '+'DROP TABLE '+@tmpTable
EXEC (@sqlStr)
END
RETURN
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請
點(diǎn)擊舉報。