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给了我一堆消息,但传入了最后一行的值,所以我可以实现分页,并在前端实现“加载更多”功能。
如果proc返回少于6条消息,我可以显然禁用“加载更多”,如果它返回6条消息,但我不知道数据库中是否有更多消息,或者那些是最后6条消息。< / p>
我的想法是,如果我传回另一个DataTable
,其中包含true
或false
,表示如果使用最后一行ID在数据库中剩下超过6条消息,我可以使用此标志来启用/禁用“加载更多”按钮。这是一个好主意吗?如果没有,那么更好的计划是什么?
如果是这样,我将如何修改此proc以将该标志传回?
答案 0 :(得分:2)
我们有几个这样的过程。简单的方法是在输出中添加一个名为“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”)这是一种非常过时的做事方式,而且通常完全没有必要。
答案 1 :(得分:0)
您可以使用输出参数发回所需的信息 - 可能是总行数,以便您可以定义要分页的页数?您只需将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将具有在过程中定义的值。