2008-12-12 81 views
3

我有一个由多个SELECT语句组成的sql语句。我想限制回来的行的总数,比如说1000行。我认为使用SET ROWCOUNT 1000指令可以做到这一点...但它不会。例如:在SQL Server中使用SET ROWCOUNT - 限制结果集

SET ROWCOUNT 1000 

select orderId from TableA 

select name from TableB 

我最初的想法是,SET ROWCOUNT将适用于整个,而不是其中的个别报表。我看到的行为是将第一个选择限制为1000,然后将第二个限制为1000,对于返回的总计2000行来说。是否有任何方法将1000限制应用于整个批次?

+0

把它设置为500:p – inspite 2008-12-12 16:16:12

回答

2

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

1

未经测试,并没有使用ROWCOUNT,但可以给你一个想法?

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

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

如果第一次总是返回1000以上,如果能够批量处理,您将如何看到第二个查询中的任何记录?

如果查询足够简单,您可以尝试通过联合来完成此操作,并对该行使用rowcount,因为这只是该点的一个查询。如果查询在返回的列中不同,我不确定将通过将整个组限制为1000行来获得什么,因为含义会有所不同。从用户的角度来看,我宁愿始终如一地获得500个订单和500个客户名称,而不是998个矿工和2个名字,另外还有210个订单和790个名称。特别是如果您碰巧对第二个查询中的信息最感兴趣,则无法使用该应用程序。

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 
0

以下为我工作:

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

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

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

0

这是您的解决方案:

TOP (Transact-SQL)

约@@行数,你可以阅读此链接:

SET ROWCOUNT (Transact-SQL)

enter image description here重要

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

我想两种方式都可以。