2012-07-12 65 views
0

我看了很多其他类似的问题,不能得到这个为我的声明工作。这是当前工作的SELECT语句,我需要添加分页。Sql SELECT语句与分页vb.net

 "SELECT TOP 15 * FROM tblEvents WHERE (dbo.fnEventSearchDistance(@CityLat, " & _ 
     "@CityLong, latitude, longitude) <= @Radius AND (StartDate >= GETDATE())) " 

这是我一直能得到最接近的一次。

 "SELECT ROW_NUMBER() OVER(ORDER BY StartDate) AS RowNum, * FROM tblEvents " & _ 
     "WHERE RowNum BETWEEN ((@PageNum - 1) * @PageSize + 1) " & _ 
     "AND (@PageNum * @PageSize) " & _ 
     "ORDER BY StartDate" 

     comm2.Parameters.AddWithValue("@PageSize", 25) 
     comm2.Parameters.AddWithValue("@PageNum", 2) 

我需要重写第一个SELECT语句纳入分页,在那里我可以添加pageSize的SELECT语句和页次参数

+1

你的问题是什么? – 2012-07-12 15:20:09

+0

重写第一个SELECT语句以添加分页 – 2012-07-12 15:20:45

+1

有什么不起作用?除了'AS RowNum' – Bort 2012-07-12 15:22:32

回答

2

假设SQL Server 2008和以前,你应该试试这个:

"SELECT col1, col2 FROM (SELECT ROW_NUMBER() OVER(ORDER BY StartDate) AS RowNum, * FROM tblEvents) AS E " & _ 
"WHERE RowNum BETWEEN ((@PageNum - 1) * @PageSize + 1) " & _ 
"AND (@PageNum * @PageSize) " & _ 
"ORDER BY StartDate" 

请注意,我把col1, col2上的选择,你应该把你需要的列放在那里。 对于SQL Server 2012,这是很简单的:

"SELECT * FROM tblEvents ORDER BY StartDate " & _ 
"OFFSET (@PageNum - 1) * @PageSize ROWS FETCH NEXT @PageNum ROWS ONLY" 
+0

伟大的分页查询..但我也需要知道查询的总记录数..如何可以做到这一点而不询问两次? – 2017-04-13 10:46:31

0

试试这个:

;With ranked AS 
(
    SELECT ROW_NUMBER() OVER(ORDER BY StartDate) AS RowNum, * 
    FROM tblEvents 
) 
SELECT * FROM Ranked 
WHERE RowNum BETWEEN ((@PageNum - 1) * @PageSize + 1) 
    AND (@PageNum * @PageSize) 
    ORDER BY StartDate 
1
CREATE PROCEDURE [dbo].[usp_PageResults_NAI] 
(
    @startRowIndex int, 
    @maximumRows int 
) 
AS 

DECLARE @first_id int, @startRow int 

-- A check can be added to make sure @startRowIndex isn't > count(1) 
-- from employees before doing any actual work unless it is guaranteed 
-- the caller won't do that 

-- Get the first employeeID for our page of records 
SET ROWCOUNT @startRowIndex 
SELECT @first_id = employeeID FROM employees ORDER BY employeeid 

-- Now, set the row count to MaximumRows and get 
-- all records >= @first_id 
SET ROWCOUNT @maximumRows 

SELECT e.*, d.name as DepartmentName 
FROM employees e 
    INNER JOIN Departments D ON 
     e.DepartmentID = d.DepartmentID 
WHERE employeeid >= @first_id 
ORDER BY e.EmployeeID 

SET ROWCOUNT 0 

GO 
0

不能引用ROW_NUMBERWHERE子句中,使用​​可以与呼叫帮助。

WITH Paging AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY StartDate) AS RowNum 
    , * 
    FROM tblEvents 
) 
SELECT * 
FROM Paging AS p 
WHERE p.RowNum BETWEEN ((@PageNum - 1) * @PageSize + 1) 
    AND (@PageNum * @PageSize) 
ORDER BY p.StartDate ASC; 

在SQL 2012开始,你将有机会获得OFFSET FETCHORDER BY帮助使分页更简单,更高效。