【问题标题】:Sql SELECT statement with paging vb.net带有分页 vb.net 的 Sql SELECT 语句
【发布时间】:2012-07-12 15:17:28
【问题描述】:

我查看了许多其他类似的问题,但无法让这适用于我的陈述。这是目前有效的SELECT语句,我需要添加分页。

      "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 语句来重写第一个 SELECT 语句以合并分页,我可以在其中添加 pageSize 和 pageNum 参数

【问题讨论】:

  • 重写第一个SELECT语句添加分页
  • 什么不起作用?除了AS RowNum之后缺少的逗号
  • 用逗号我得到错误“无效的列名'RowNum'。”

标签: sql vb.net select paging


【解决方案1】:

假设 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"

【讨论】:

  • 很好的分页查询..但我还需要知道查询的总记录数..如何在不查询两次的情况下做到这一点?
【解决方案2】:
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 

【讨论】:

    【解决方案3】:

    试试这个:

    ;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
    

    【讨论】:

      【解决方案4】:

      您不能在WHERE 子句中引用ROW_NUMBER,使用Common Table Expression (CTE) 可以帮助分页。

      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 开始,您将可以访问 ORDER BY 中的 OFFSET FETCH,以帮助更轻松、更高效地进行分页。

      【讨论】:

        猜你喜欢
        • 2012-11-09
        • 2020-06-20
        • 1970-01-01
        • 2011-01-28
        • 1970-01-01
        • 1970-01-01
        • 2017-07-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多