在SQL Server中使用SET ROWCOUNT - 限制结果集

时间:2008-12-12 16:06:04

标签: sql-server tsql

我有一个包含多个SELECT语句的sql语句。我想限制返回的总行数,让我们说1000行。我认为使用SET ROWCOUNT 1000指令会这样做......但事实并非如此。例如:

SET ROWCOUNT 1000

select orderId from TableA

select name from TableB

我最初的想法是SET ROWCOUNT将应用于整个批次,而不是其中的单个陈述。我看到的行为是它将第一个选择限制为1000,然后将第二个选择限制为1000,总共返回2000行。有没有办法将1000限制作为一个整体应用于批次?

8 个答案:

答案 0 :(得分:2)

不在一个声明中。您将不得不从每个语句后所需的总行中减去@@ ROWCOUNT,并使用变量(例如“@RowsLeft”)来存储所需的剩余行。然后,您可以从每个单独的查询中选择SELECT TOP @RowsLeft ...

答案 1 :(得分:1)

未经测试且未使用ROWCOUNT,但可以给你一个想法吗?

假设TableA和TableB中的col1是相同的类型。

SELECT TOP 1000 * 
FROM (select orderId 
      from TableA 
      UNION ALL 
      select name from TableB) t

答案 2 :(得分:1)

使用TOP而不是ROWCOUNT

http://msdn.microsoft.com/en-us/library/ms189463.aspx

你试图从所有表中获得1000行MAX吗?

我认为其他方法可能会首先从最常见的查询中填满,而您可能永远不会从较低的查询得到结果。

答案 3 :(得分:1)

如果您能够批量执行此操作,如果第一个查询总是返回超过1000,您将如何看到第二个查询中的任何记录?

如果查询足够相似,您可以尝试通过联合执行此操作并在其上使用rowcount,因为此时它只是一个查询。如果返回的列中的查询不同,我不确定将整个组限制为1000行会得到什么,因为含义会有所不同。从用户的角度来看,我宁愿一天获得500个订单和500个客户名称,而不是998个名字和2个名字,下一个是210个订单和790个名字。如果您碰巧对第二个查询中的信息最感兴趣,则无法使用该应用程序。

答案 4 :(得分:1)

这个要求听起来很奇怪。除非您正在联合或加入来自两个选择的数据,否则将它们视为一个以便您应用最大行只是没有意义,因为它们在那时是不相关的查询。如果您确实需要这样做,请尝试:

select top 1000 from (
    select orderId, null as name, 'TableA' as Source from TableA
    union all
    select null as orderID, name, 'TableB' as Source from TableB
) a order by Source

答案 5 :(得分:1)

SET ROWCOUNT适用于每个单独的查询。在您给出的示例中,它被应用两次,每次SELECT语句一次,因为每个语句都是它自己的批处理(它们没有分组或联合或任何东西,因此完全单独执行)。

@ RedFilter的方法似乎最有可能给你你想要的东西。

答案 6 :(得分:0)

以下对我有用:

CREATE PROCEDURE selectTopN
(
    @numberOfRecords int
)
AS
    SELECT TOP (@numberOfRecords) * FROM Customers
GO

答案 7 :(得分:0)

这是你的解决方案:

TOP (Transact-SQL)

关于@@ RowCount,您可以阅读此链接:

SET ROWCOUNT (Transact-SQL)

enter image description here重要

在SQL Server的未来版本中使用SET ROWCOUNT will not affect DELETEINSERTUPDATE语句。 Avoid SET ROWCOUNT在新的开发工作中使用DELETEINSERTUPDATE语句,并计划修改当前使用它的应用程序。对于类似的行为,请使用TOP语法。有关详细信息,请参阅TOP (Transact-SQL)

我认为两种方式都有效。!