Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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
C# 使用Top和Count的最佳方法-SQL Server 2008_C#_Sql Server 2008 - Fatal编程技术网

C# 使用Top和Count的最佳方法-SQL Server 2008

C# 使用Top和Count的最佳方法-SQL Server 2008,c#,sql-server-2008,C#,Sql Server 2008,我有一个2008 C应用程序后端SQL Server 2008,其中有时查询会返回大量结果。因此,我研究了一些分页算法,并使用TOP语句设置了一个分页算法。我喜欢这样一个事实:如果我总共有500条结果,并且每页只显示20条结果,那么我只能查询数据库中的20条记录,而不是将所有500条记录存储在内存中 但我遇到的问题是,为了实现分页算法,我需要知道这个查询中总共有多少条记录。因此,我所做的就是使用相同的参数运行另一个查询,该查询只选择ID而不是整个对象,以使其快速运行。但是出于某种原因,我认为运行

我有一个2008 C应用程序后端SQL Server 2008,其中有时查询会返回大量结果。因此,我研究了一些分页算法,并使用TOP语句设置了一个分页算法。我喜欢这样一个事实:如果我总共有500条结果,并且每页只显示20条结果,那么我只能查询数据库中的20条记录,而不是将所有500条记录存储在内存中

但我遇到的问题是,为了实现分页算法,我需要知道这个查询中总共有多少条记录。因此,我所做的就是使用相同的参数运行另一个查询,该查询只选择ID而不是整个对象,以使其快速运行。但是出于某种原因,我认为运行这两个查询从而建立两个连接并不是最好的方法

所以我需要所有记录的计数,但只想选择TOP中使用的有限数字。这里有临时桌子吗?我现在有两个不同的存储过程


感谢所有人提供的最佳实践建议。

您可以使用对象数据源…来实现此自定义分页。

我将使用ROW_NUMBER而不是ORDER BY。。。。更多详细信息。

我不知道您使用的分页方法,但是我通常使用的技术是使用行数函数,例如:

SELECT  Description, Date
FROM
(
    SELECT  ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        Description, Date 
    FROM Log
) AS LogWithRowNumbers
WHERE  Row >= 1 AND Row <= 10
但是,您可以在同一批中执行这两条语句,以避免需要到数据库服务器的额外往返


Source-

如果在存储过程中同时执行这两个选择,则在使用Fill方法后,将在数据集中获得两个数据表。

我将尝试以下操作:

;WITH CTE AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        COUNT(*) OVER() AS TotalCount,
        Description, Date 
    FROM Log
)

SELECT *
FROM CTE
WHERE Row BETWEEN 1 AND 10

这将在1查询中提供分页和计数。您还可以使用CASE语句仅在特定时间进行计数。例如,当用户翻页时,计数是否会改变?

感谢您的回复。我在获取计数的存储过程中使用了行号。为此,我使用ExecuteScalar;在C中,对于使用Top的存储过程,我正在填充一个dataset.Fillds;我想我不确定如何从一个存储过程返回这两个存储过程。但是,一旦我有了计数,那不是不必要地再次运行计数查询吗?因为从那里开始,我需要的只是顶部查询?谢谢@PTVee运行一个单独的计数查询并不是不必要的,因为无论您选择什么方法,您都无法从主分页查询中获取此信息-从主分页查询中获得的最佳信息是当前页面的大小。此外,计数查询通常相当快。好的,Bob回答了我上面关于在同一存储过程中运行这两个查询的问题。我感谢所有的帮助!啊哈!!好的,我可以试试!!谢谢然后,也许我的应用程序可以确定我是否不需要后续页面的计数,因为我已经有了它,所以我可以测试它,然后只运行只获取顶级记录的SP。我只是想大声说出来。是的,但是如果在页面请求之间另一个用户添加/删除了一条记录,你想怎么做?嗯哼?我想这是真的,可能只有一两条记录可以输入,但是分页可能不准确。嗨,鲍勃,工作得很好!我将两个选择都放在一个存储过程中,并将第二个选择填充到数据集中。因此,虽然我仍在运行这两个查询,但我已经消除了两个往返。感谢大家的帮助。这可能比两个查询的效率要低,因为您要多次返回count,也不确定查询优化器是否会重新计算可能的每一行的计数。在我们的应用程序中,我们使用CASE语句和标志来控制何时进行计数。
;WITH CTE AS
(
    SELECT 
        ROW_NUMBER() OVER (ORDER BY Date DESC) AS Row,
        COUNT(*) OVER() AS TotalCount,
        Description, Date 
    FROM Log
)

SELECT *
FROM CTE
WHERE Row BETWEEN 1 AND 10