我有一个包含多个SELECT语句的sql语句。我想限制返回的总行数,让我们说1000行。我认为使用SET ROWCOUNT 1000指令会这样做......但事实并非如此。例如:
SET ROWCOUNT 1000
select orderId from TableA
select name from TableB
我最初的想法是SET ROWCOUNT将应用于整个批次,而不是其中的单个陈述。我看到的行为是它将第一个选择限制为1000,然后将第二个选择限制为1000,总共返回2000行。有没有办法将1000限制作为一个整体应用于批次?
答案 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)
这是你的解决方案:
关于@@ RowCount,您可以阅读此链接:
重要
在SQL Server的未来版本中使用SET ROWCOUNT
will not affect
DELETE
,INSERT
和UPDATE
语句。 Avoid
SET ROWCOUNT
在新的开发工作中使用DELETE
,INSERT
和UPDATE
语句,并计划修改当前使用它的应用程序。对于类似的行为,请使用TOP语法。有关详细信息,请参阅TOP (Transact-SQL)。
我认为两种方式都有效。!