C# 在sql for asp.net gridview中使用行号()进行自定义分页

C# 在sql for asp.net gridview中使用行号()进行自定义分页,c#,asp.net,sql,sql-server,gridview,C#,Asp.net,Sql,Sql Server,Gridview,我正在尝试使用sql中的ROW_NUMBER()为asp.net中的gridview实现自定义分页。下面的(经典)查询工作得很好,但是它的性能不是很好,因为我必须将整个表复制到一个新表中,然后从新表中选择20条记录。它有时甚至可以在不分页的情况下更好地工作,只需一次检索所有记录。我试图在where子句中使用ROW_NUMBER(),但sql不允许我这样做。如何改进下面的查询?你有什么建议?我想我需要找到一种方法来消除将整个数据集复制到一个新表的过程,但是怎么做呢 SELECT PostId, M

我正在尝试使用sql中的ROW_NUMBER()为asp.net中的gridview实现自定义分页。下面的(经典)查询工作得很好,但是它的性能不是很好,因为我必须将整个表复制到一个新表中,然后从新表中选择20条记录。它有时甚至可以在不分页的情况下更好地工作,只需一次检索所有记录。我试图在where子句中使用ROW_NUMBER(),但sql不允许我这样做。如何改进下面的查询?你有什么建议?我想我需要找到一种方法来消除将整个数据集复制到一个新表的过程,但是怎么做呢

SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   

INTO #Results   
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 

ORDER BY LastUpdateDateTime DESC

-----------------------------------------------------


SELECT * FROM #Results
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

DROP TABLE #Results

对于这样简单的操作,您真的不需要使用临时表,只需使用子查询或CTE即可

使用子查询

SELECT * 
FROM (
SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
) Sub
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
使用CTE

;WITH CTE
AS
 (
    SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row     
    FROM   Posts
    WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
 )
SELECT * 
FROM CTE
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

对于这样简单的操作,您真的不需要使用临时表,只需使用子查询或CTE即可

使用子查询

SELECT * 
FROM (
SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
) Sub
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1
使用CTE

;WITH CTE
AS
 (
    SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row     
    FROM   Posts
    WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
 )
SELECT * 
FROM CTE
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 
AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

我不确定这是否会解决性能问题,您可以使用子查询而不是临时表:

SELECT p.*
FROM (SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
      FROM   Posts
      WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
     ) p
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1;

我不确定这是否会解决性能问题,您可以使用子查询而不是临时表:

SELECT p.*
FROM (SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row    
      FROM   Posts
      WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 
     ) p
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1;

您可以使用
CTE

;With CTE as
(
SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 

ORDER BY LastUpdateDateTime DESC

)SELECT Row,* FROM CTE
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

您可以使用
CTE

;With CTE as
(
SELECT PostId, Message, (ROW_NUMBER() OVER (ORDER BY LastUpdateDateTime DESC)) as Row   
FROM   Posts
WHERE  Posts.TimePointId=@TimePointId AND IsFixed=0 

ORDER BY LastUpdateDateTime DESC

)SELECT Row,* FROM CTE
WHERE Row BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1

我已经试过了,但它无法识别行:无效的列名“Row”。@erkaner是否使用子查询???您需要使用子查询,因为生成子查询的查询无法访问行号。您需要使用子查询或CTE来根据行号操作结果。我已经尝试过了,但它无法识别行:无效的列名“row”。@erkaner您使用子查询了吗???您需要使用子查询,因为生成子查询的查询无法访问行号。您需要使用子查询或CTE根据行号操作结果。