日期:2014-05-17 浏览次数:20521 次
IF OBJECT_ID('T') IS NOT NULL DROP TABLE T CREATE TABLE T(ID INT, ParentID INT, LEVEL INT,OrderNum int) --测试数据 INSERT INTO T SELECT 960, 878, 1, 2 UNION ALL SELECT 961, 960, 2 ,3 UNION ALL SELECT 962, 961, 3 ,4 UNION ALL SELECT 963, 878, 1 ,7 UNION ALL SELECT 964, 963, 2 ,8 UNION ALL SELECT 965, 964, 3 ,9 UNION ALL SELECT 966, 963, 2 ,11 UNION ALL SELECT 967, 878, 1 ,13 UNION ALL SELECT 968, 878, 1 ,14 UNION ALL SELECT 969, 878, 1 ,15 CREATE PROC sp_getUser ( @level INT ,--每页几个用户 @PageIndex int--页面索引 ) AS BEGIN DECLARE @_tab TABLE (id INT IDENTITY(1,1),startIndex INT, endIndex INT,userID INT) DECLARE @_startIndex INT DECLARE @_endIndex INT ;WITH cte AS ( SELECT [主ID]=ID, * FROM T WHERE [LEVEL]=1 UNION ALL SELECT [主ID]=c.[主ID],a.* FROM T a JOIN cte c ON a.ParentID =c.Id ) INSERT INTO @_tab SELECT MIN(id),MAX(id),[主ID] FROM cte GROUP BY [主ID] -- ORDER BY OrderNum --每页的开始索引 SELECT @_startIndex=startIndex FROM ( SELECT * FROM @_tab WHERE id BETWEEN @level*@PageIndex-1 AND @level*@PageIndex ) AS t WHERE t.id=@level*@PageIndex-1 --每页的结束索引 SELECT @_endIndex=endIndex FROM ( SELECT * FROM @_tab WHERE id BETWEEN @level*@PageIndex-1 AND @level*@PageIndex ) AS t WHERE t.id=@level*@PageIndex PRINT 'start:'+ CAST(@_startIndex AS VARCHAR ) PRINT 'end:'+CAST(@_endIndex AS VARCHAR ) IF @_endIndex IS NULL OR LEN(@_endIndex)=0 BEGIN SELECT * FROM T WHERE id >=@_startIndex END ELSE BEGIN SELECT * FROM T WHERE id BETWEEN @_startIndex AND @_endIndex END END --每页2个用户,第一页 EXEC sp_getUser 2,1 /* ID ParentID LEVEL OrderNum ----------- ----------- ----------- ----------- 960 878 1 2 961 960 2 3 962 961 3 4 963 878 1 7 964 963 2 8 965 964 3 9 966 963 2 11 (7 行受影响) */ --每页2个用户,第二页 EXEC sp_getUser 2,2 /* ID ParentID LEVEL OrderNum ----------- ----------- ----------- ----------- 967 878 1 13 968 878 1 14 (2 行受影响) */ --每页2个用户,第三页 EXEC sp_getUser 2,3 /* ID ParentID LEVEL OrderNum ----------- ----------- ----------- ----------- 969 878 1 15 (1 行受影响) */