【问题标题】:SQL Proc Modification QuestionSQL Proc 修改问题
【发布时间】:2011-06-27 03:38:39
【问题描述】:
ALTER PROCEDURE [dbo].[spGetMessages]
    @lastRow int
AS
BEGIN
    -- Insert statements for procedure here
    DECLARE @StartRow INT,@EndRow INT
    SELECT @StartRow = (@lastRow + 1), @EndRow = (@lastRow + 6)

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY
        CASE WHEN @sort = 'votes1' THEN m.votes END DESC,
        CASE WHEN @sort = 'votes2' THEN m.votes END ASC,
        CASE WHEN @sort = 'age1' THEN datediff(minute,m.timestamp, getdate()) END ASC,
        CASE WHEN @sort = 'age2' THEN datediff(minute,m.timestamp, getdate()) END DESC
      ) AS rows,
      m.message,
      m.messageId
    FROM
      tblMessages m
    WHERE
      m.deleted != 1
      )
     SELECT * 
     FROM cte WHERE ROWS BETWEEN @StartRow AND @EndRow
    ORDER BY rows
END

所以这个过程给我带来了一堆消息,但传递了最后一行的值,这样我就可以实现分页,并在前端实现“加载更多”功能。

如果 proc 返回的消息少于 6 条,我显然可以禁用“加载更多”,但如果它返回 6 条消息,我不知道数据库中是否还有更多消息,或者那些是最后 6 条消息。

我的想法是,如果我传回另一个包含 truefalseDataTable,表示使用最后一行 id 在数据库中剩余的消息是否超过这 6 条,我可以使用此标志来启用/禁用“加载更多”按钮。这是一个好主意吗?如果没有,有什么更好的计划?

如果是这样,我将如何修改此过程以将标志传回?

【问题讨论】:

  • 通过参数返回总记录数如何?然后你也可以计算你有多少页
  • 根据最后一个 rowId,LEFT 的总记录数是我认为的目标。

标签: .net tsql sql-server-2008 stored-procedures paging


【解决方案1】:

我们有几个这样的 procs。简单的方法是在输出中添加一个名为“TotalCount”的附加列,该列返回所有行的计数。

在你的情况下,它看起来像:

;WITH cte AS (SELECT ROW_NUMBER() OVER (ORDER BY
        CASE WHEN @sort = 'votes1' THEN m.votes END DESC,
        CASE WHEN @sort = 'votes2' THEN m.votes END ASC,
        CASE WHEN @sort = 'age1' THEN datediff(minute,m.timestamp, getdate()) END ASC,
        CASE WHEN @sort = 'age2' THEN datediff(minute,m.timestamp, getdate()) END DESC      ) AS rows,
            m.message, m.messageId,
        TotalCount = COUNT(m.Id) OVER ( PARTITION BY NULL)
    FROM tblMessages m
    WHERE m.deleted != 1
)
SELECT *
FROM cte 
WHERE ROWS BETWEEN @StartRow AND @EndRow
ORDER BY rows

我假设 tblMessages 有一个名为 Id 的列。关键是简单地计算该表中的唯一 ID。

我们这样做是为了不必运行 2 个查询。当然,根据数据的大小,这可能会对性能产生影响。所以测试两种方式。

======
顺便说一句,我想到了一件事。您可能会考虑不使用前缀(如“tbl”和“sp”)这是一种非常过时的做事方式,通常完全没有必要。

【讨论】:

  • 这实际上是多少行?还剩多少?
  • @slandau:这是基于您的 where 子句的所有匹配记录的计数,即使是那些不在实际结果集中的记录。
【解决方案2】:

您可以使用输出参数来发回您需要的信息 - 也许是总行数,以便您可以定义要分页的页数?您只需将 OUTPUT 参数添加到 proc 声明中:

ALTER PROCEDURE [dbo].[spGetMessages]
    @lastRow int,
    @yourFlagHere BIT OUTPUT

我添加了 BIT 来支持您的二进制验证,但您可以使用其他几种类型。欲了解更多信息,请查看Returning Data by Using OUTPUT Parameters。然后,您将通过调用 proc 将值分配给输出参数

EXEC dbo.spGetMessages @lastRowYouDefined, @yourFlagHere OUTPUT

您的@yourFlagHere var 将具有在过程中定义的值。

【讨论】:

    猜你喜欢
    • 2011-06-30
    • 1970-01-01
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    相关资源
    最近更新 更多