Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/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# 分页SQL查询_C#_Winforms_Sql Server 2008 - Fatal编程技术网

C# 分页SQL查询

C# 分页SQL查询,c#,winforms,sql-server-2008,C#,Winforms,Sql Server 2008,在winform的datagrid中,我显示了从DB中选择的大约100k行。显示所有这些记录需要很多时间。有没有办法使select查询更快,或者加载前200条记录。然后,如果用户单击“下一步”按钮,将显示接下来的200条记录。这可能吗?我知道mysql有限制,但我需要一些东西来为sql server 2008工作。有几种方法可以做到这一点,通常使用CTE或嵌套查询和行号()。 见例。 在SQL 2012中,现在终于可以在单个查询中实现这一点,即偏移量xxx行仅获取下一个xxx行-请参见有一个方

在winform的datagrid中,我显示了从DB中选择的大约100k行。显示所有这些记录需要很多时间。有没有办法使select查询更快,或者加载前200条记录。然后,如果用户单击“下一步”按钮,将显示接下来的200条记录。这可能吗?我知道mysql有限制,但我需要一些东西来为sql server 2008工作。

有几种方法可以做到这一点,通常使用CTE或嵌套查询和
行号()。
见例。


在SQL 2012中,现在终于可以在单个查询中实现这一点,即
偏移量xxx行仅获取下一个xxx行
-请参见有一个方法可以实现它,但它并不漂亮。如果您使用的是实体框架,则可以编写LINQ以对结果进行分页,如:

var books= context.Books.OrderBy(b => b.Title).Skip(300).Take(100);
如果在其上抛出SQL探查器,生成的SQL将如下所示,您可以将其用作构建自己语句的指南:

SELECT TOP (200) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[Title] AS [Title]
FROM
(
    SELECT 
        [Extent1].[Id] AS [Id], 
        [Extent1].[Title] AS [Title],
        row_number() OVER (ORDER BY [Extent1].[Title] ASC) AS [row_number]
    FROM [dbo].[Books] AS [Extent1]
)  AS [Extent1]
WHERE
    [Extent1].[row_number] > 100
ORDER BY
    [Extent1].[Title] ASC
存储过程



除了上述存储过程外,您还可以实现
索引
以加快搜索速度,或者使用SQL Profiler检查执行时间延迟的原因。

您可以使用带有行数排序功能的通用表表达式。以下是一个例子:

CREATE PROCEDURE PagingSample
  @PageNumber int,
  @PageSize int
AS

WITH Results AS (
  SELECT 
    ROW_NUMBER() OVER(ORDER BY MR.MRN ASC) As RowNumber,
    MR.MRN
FROM 
  dbo.SomeTable MR WITH (NOLOCK)    
)

SELECT 
  R.RowNumber,
  R.MRN
FROM
  Results R
WHERE
  RowNumber > (@PageNumber * @PageSize) - @PageSize 
  AND RowNumber < (@PageNumber * @PageSize) + 1 

您将获得201到300条记录顺便说一句,我在很多方面都喜欢这种技术-了解Microsoft如何在其框架中使用SQL Profiler for SQL或用于托管代码的反汇编程序来实现这一点,您可能已经找到了最有效的方法,因为他们已经花了很多时间从他们的流程中挤出每一盎司的效率。你可能的重复也应该投票给最能回答你问题的答案。这将有助于搜索相同问题的用户
Test 1, 3
CREATE PROCEDURE PagingSample
  @PageNumber int,
  @PageSize int
AS

WITH Results AS (
  SELECT 
    ROW_NUMBER() OVER(ORDER BY MR.MRN ASC) As RowNumber,
    MR.MRN
FROM 
  dbo.SomeTable MR WITH (NOLOCK)    
)

SELECT 
  R.RowNumber,
  R.MRN
FROM
  Results R
WHERE
  RowNumber > (@PageNumber * @PageSize) - @PageSize 
  AND RowNumber < (@PageNumber * @PageSize) + 1 
Exec PagingSample @PageNumber = 3, @PageSize = 100