Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SQL过程修改问题_.net_Tsql_Sql Server 2008_Stored Procedures_Paging - Fatal编程技术网

.net SQL过程修改问题

.net SQL过程修改问题,.net,tsql,sql-server-2008,stored-procedures,paging,.net,Tsql,Sql Server 2008,Stored Procedures,Paging,这个过程会给我一堆消息,但会传入最后一行的值,这样我就可以实现分页,并在前端实现“加载更多”功能 如果proc返回的消息少于6条,我可以禁用“load more”,显然,如果它返回6条消息,我不知道数据库中是否还有更多消息,或者这些消息是最后6条消息 我的想法是,如果我传回另一个DataTable,其中包含true或false,表示使用最后一行id在数据库中保留的消息是否超过这6条,我可以使用此标志启用/禁用“加载更多”按钮。这是个好主意吗?如果没有,有什么更好的计划 如果是这样,我将如何修改此

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

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

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


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

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

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

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
我假设tblMessages有一个名为Id的列。重点是简单地计算该表中唯一的Id

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

=======

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

< P>你可以使用一个输出参数来回传你需要的信息——也许是总的行数,这样你就可以定义页数反对页码了吗?您只需将输出参数添加到proc声明中:

;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
我添加了位来支持二进制验证,但可以使用其他几种类型。有关更多信息,请查看。然后,通过使用调用proc将值分配给输出参数

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

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

如何通过参数返回记录总数?然后你可以计算出你有多少页,根据最后一个rowId,剩下的记录总数,我想这是我的目标。这实际上是一行的计数?还剩多少?@slandau:这是基于where子句的所有匹配记录的计数,即使是不在实际结果集中的记录。
EXEC dbo.spGetMessages @lastRowYouDefined, @yourFlagHere OUTPUT