我需要编写一个sql查询来显示带有catch的前25条记录

时间:2010-10-11 20:04:23

标签: asp.net sql-server

我需要编写如下的查询,该查询将绑定到网格

select top 25 * from ErrTable Order by DateErrorad Desc

但是,我需要编写此查询以一次只返回25条记录,但是当用户单击下一条时,它将显示数据库中接下来的25条最新记录。

我怎么能做到这一点?

7 个答案:

答案 0 :(得分:3)

您可以使用ROW_NUMBER()实现“分页”技术,如本文所述:http://www.davidhayden.com/blog/dave/archive/2005/12/30/2652.aspx

答案 1 :(得分:2)

好的,因为我不知道什么是数据库服务器/引擎,但基本上你需要一个范围(在你的情况下是25)和一个页码(例如0是第一页,1是25个记录的下一页,等等)

在MySQL中,你可以这样做(使用LIMIT命令)....

SELECT * FROM TABLE LIMIT START, RANGE;

Wher TABLE是您的表名,START是您的起始索引/范围,例如,如果您有记录0 - 24,则可以设置start = 25,以读取下一个25(这是RANGE发挥作用的地方。

这仅适用于MySQL,但在DB2中却有所不同。找出您的数据库服务器/引擎处理分页的人。

在DB2中:

SELECT * FROM TABLE FETCH FIRST N ROW ONLY;

其中N是数值。

编辑对于MSSQL,您可以看到另一个相关帖子:

这是一篇展示Paging in ASP.NET的文章。

答案 2 :(得分:0)

您可以使用LIMIT命令选择给定范围内的条目。但是,我不确定是否所有引擎都支持它,所以更通用的解决方案(尽管效率不高,我估计)是......

SELECT TOP 25 *
FROM YOURTABLE
WHERE IDCOL NOT IN (SELECT TOP 25 * FROM YOURTABLE)

很抱歉定义松散,我要离开了,不能更详细地回答。

答案 3 :(得分:0)

在MySQL中你可以用LIMIT做到这一点,在MSSQL中我不知道是否有效。

SELECT * FROM table LIMIT 10

SELECT * FROM table LIMIT 0, 10 

这将显示数据库中的前10个结果。

SELECT * FROM table LIMIT 5, 5 

这将显示记录6到10

答案 4 :(得分:0)

假设您正在使用SQL Server(基于ASP.NET标记):

declare @offset int
set @offset = 25

select * from (
   select *, row_number() over (order by DateErrorad desc) as i from ErrTable
) a
where i <= @offset + 25 and i > @offset

我强烈建议您使用ORM。我喜欢LINQ-to-SQL(它是ASP.NET的完美补充),你可以这样做:

var rows = Errors.Skip(offset).Take(25);

答案 5 :(得分:0)

我想这取决于您的DBMS,以下LINQ2SQL查询 (来自AdventureWorks的表DatabaseLogs

using (DataClasses1DataContext context = new DataClasses1DataContext())
{
    context.Log = Console.Out;
    var qq3 = context.DatabaseLogs.Skip(20).Take(10).ToList();
}

为MSSQL生成以下查询

SELECT [t1].[DatabaseLogID], [t1].[PostTime], [t1].[DatabaseUser], [t1].[Event], [t1].[Schema] AS [Schema], [t1].[Object], [t1].[TSQL], [t1].[XmlEvent]
FROM (
    SELECT ROW_NUMBER() OVER (ORDER BY [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL]) AS [ROW_NUMBER], [t0].[DatabaseLogID], [t0].[PostTime], [t0].[DatabaseUser], [t0].[Event], [t0].[Schema], [t0].[Object], [t0].[TSQL], [t0].[XmlEvent]
    FROM [dbo].[DatabaseLog] AS [t0]
    ) AS [t1]
WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1
ORDER BY [t1].[ROW_NUMBER]
-- @p0: Input Int (Size = -1; Prec = 0; Scale = 0) [20]
-- @p1: Input Int (Size = -1; Prec = 0; Scale = 0) [10]
-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 4.0.30319.1

答案 6 :(得分:0)

创建存储过程并传递范围

create procedure dbo.SelectWindow
@start int, @end int
as
begin

select *
from
(
select
*,
row_number() (order by ID) as Row
from dbo.table
) a
where Row between @start and @end


end
go