Sql server 如何有效地限制SQLServer2000中返回的行(将行从X返回到Y)?

Sql server 如何有效地限制SQLServer2000中返回的行(将行从X返回到Y)?,sql-server,performance,sql-server-2000,paging,compatibility,Sql Server,Performance,Sql Server 2000,Paging,Compatibility,我正在开发一个必须与MS SQL Server 2000兼容的系统是的,很糟糕,但请告诉仍在使用它的客户。不管怎么说,我遇到了这种情况的障碍 这个表可以在it产品表中有很多记录,真的。我们的一个客户甚至有近100万条记录。我正在建立一个网络商店,需要显示该表中的记录。当然,我应该在web上提供分页功能,因此我需要一个选项来只选择从X到Y的记录 但如何做到这一点,既高效,又能在SQL Server 2000中工作?据我所知,SQL Server 2000上唯一半可行的大型表解决方案是模式 SELE

我正在开发一个必须与MS SQL Server 2000兼容的系统是的,很糟糕,但请告诉仍在使用它的客户。不管怎么说,我遇到了这种情况的障碍

这个表可以在it产品表中有很多记录,真的。我们的一个客户甚至有近100万条记录。我正在建立一个网络商店,需要显示该表中的记录。当然,我应该在web上提供分页功能,因此我需要一个选项来只选择从X到Y的记录


但如何做到这一点,既高效,又能在SQL Server 2000中工作?

据我所知,SQL Server 2000上唯一半可行的大型表解决方案是模式

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID FROM products p2)
这将显示第201-300行

如果需要排序和筛选,通常需要确保查询和子查询中的顺序和筛选相同,否则结果会有点奇怪,如

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID 
                               FROM products p2 
                               WHERE p2.productGroup = 2
                               ORDER BY p2.productName)
    AND p1.productGroup = 2
  ORDER BY p1.productName
这将返回按名称排序的productGroup为2的201-300产品


这种方法的缺点是SQLServer2000不支持TOP@variable语法,因此上述查询中的100和200无法轻松参数化。要生成此查询,您必须使用将使用动态SQL的SP,或者在客户端应用程序上编译它,然后按原样将其发送到数据库

在一篇无关的长篇大论中,我总是想知道为什么在数据库级别上不支持这种功能,例如

SELECT ROW 201-300 *
  FROM products
  WHERE....

正如这个场景一次又一次出现一样。

据我所知,对于SQL Server 2000上的大型表,唯一半可行的解决方案是模式

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID FROM products p2)
这将显示第201-300行

如果需要排序和筛选,通常需要确保查询和子查询中的顺序和筛选相同,否则结果会有点奇怪,如

SELECT TOP 100 *
  FROM products p1
  WHERE p1.productID not in (SELECT TOP 200 productID 
                               FROM products p2 
                               WHERE p2.productGroup = 2
                               ORDER BY p2.productName)
    AND p1.productGroup = 2
  ORDER BY p1.productName
这将返回按名称排序的productGroup为2的201-300产品


这种方法的缺点是SQLServer2000不支持TOP@variable语法,因此上述查询中的100和200无法轻松参数化。要生成此查询,您必须使用将使用动态SQL的SP,或者在客户端应用程序上编译它,然后按原样将其发送到数据库

在一篇无关的长篇大论中,我总是想知道为什么在数据库级别上不支持这种功能,例如

SELECT ROW 201-300 *
  FROM products
  WHERE....

由于此场景反复出现。

我们使用了以下技术:

SELECT TOP @top * FROM ...

其中@top等于Y。因此SQL server只选择最上面的行,为了获得预期的页面,我们使用了简单的抓取而不提取数据,直到X

为止,我们使用了以下技术:

SELECT TOP @top * FROM ...

其中@top等于Y。因此SQL server只选择最上面的行,为了获得预期的页面,我们使用了简单的获取而不提取数据,直到XSWeko得到了一个好的答案,这是我的第一个想法。如果不想使用子查询,可以:

SET ROWCOUNT @Y

SELECT *
FROM products p1    
WHERE p1.productID > @X
ORDER BY p1.productID

SET ROWCOUNT 0

尽管你必须记住@X,它可能不是整数或恒等式。

斯维科有一个很好的答案,这是我的第一个想法。如果不想使用子查询,可以:

SET ROWCOUNT @Y

SELECT *
FROM products p1    
WHERE p1.productID > @X
ORDER BY p1.productID

SET ROWCOUNT 0

尽管您必须记住@X,它可能不是整数或标识。

我在搜索类似解决方案时找到了这个答案:

SELECT
    product_name,
    list_price
FROM
    production.products
ORDER BY
    list_price,
    product_name 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;

完整的解释是可用的。

我在搜索类似解决方案时找到了这个答案:

SELECT
    product_name,
    list_price
FROM
    production.products
ORDER BY
    list_price,
    product_name 
OFFSET 10 ROWS 
FETCH NEXT 10 ROWS ONLY;

完整的解释是可用的。

不确定,但我认为TOP@TOP是SQL Server 2005功能。抱歉-这在SQL 2000中不可能。不确定,但我认为TOP@TOP是SQL Server 2005功能。抱歉-这在SQL 2000中不可能。您肯定要包括订购,即使没有过滤——否则页面刷新的结果可能会有所不同——产品也可能出现在多个页面上,这只是一个一般性问题mess@Damien:实际上,如果表中没有排序子句,则结果应按聚集索引的顺序显示。但是,是的,为了安全起见,我总是点餐。反过来呢?从“按产品id从产品订单中选择top 100*”从“按产品id从产品订单中选择top 300*”asc p order by product\u id desc这至少不使用任何INs或其他查找。@Sweko-这是一个常见的误解。没有订货依据条款,就没有订货保证。除此之外,在Enterprise Edition中,一个表扫描可以与另一个已经在进行的表扫描相结合,用于不同的连接/查询,然后对表的开始部分进行部分表扫描,以获得它尚未获得的其余行。@SWeko-RE:2000以后的版本中,无论是行数还是介于行数之间的版本,这都非常容易,而且您肯定希望包括排序,即使没有过滤-否则结果可能会在页面刷新之间变化-产品可能会出现在多个页面上,而且它只是一个g
一般的mess@Damien:实际上,如果表中没有排序子句,则结果应按聚集索引的顺序显示。但是,是的,为了安全起见,我总是点餐。反过来呢?从“按产品id从产品订单中选择top 100*”从“按产品id从产品订单中选择top 300*”asc p order by product\u id desc这至少不使用任何INs或其他查找。@Sweko-这是一个常见的误解。没有订货依据条款,就没有订货保证。除此之外,在Enterprise Edition中,一个表扫描可以与另一个已经在进行的表扫描相结合,用于不同的连接/查询,然后对表的开始部分进行部分表扫描,以获得它尚未获得的其余行。@SWeko-RE:您的回答在2000以后的版本中,这非常容易,行数介于和之间,无论如何,我很想告诉客户他们的硬件规格很差,请留下他们的详细信息:@digiguru-抱歉,我甚至不知道他们是谁,我想有好几个这样的客户,因为我们销售的软件在这里很受欢迎。我想告诉客户他们的硬件规格很糟糕,请留下他们的详细信息:@digiguru-对不起,我甚至不知道他们是谁,我想有好几个这样的客户,因为我们销售的软件在这里很受欢迎。这和top有什么不同吗?事实上,这是一个有趣的想法,即使是top。这使得在页面之间来回走动变得很容易,而且性能非常好。但是,您不能跳转到任意页面,这是一个缺点。我不知道,也许这可以结合使用。SQL Server 2000不支持TOP@variable语法。但您可以使用SET ROWCOUNT@Y将其作为参数发送。排名靠前的答案有固定的100条记录。这和排名靠前的有什么不同吗?事实上,这是一个有趣的想法,即使排名靠前。这使得在页面之间来回走动变得很容易,而且性能非常好。但是,您不能跳转到任意页面,这是一个缺点。我不知道,也许这可以结合使用。SQL Server 2000不支持TOP@variable语法。但您可以使用SET ROWCOUNT@Y将其作为参数发送。最上面的答案有固定的100条记录。问题是-此语法是在SQL Server 2012中引入的,而此问题是关于SQL Server 2000的:虽然对于当前版本,是的,这绝对是正确的选择问题是-此语法是在SQL Server 2012中引入的,而此问题是关于SQL Server 2000的:虽然对于当前版本,是的,这绝对是正确的选择