2010-06-03 50 views
0

我有以下TSQL声明,我想弄清楚如何我可以继续获得结果(一次100行),将它们存储在一个变量中(因为我将不得不添加每次选择后的总数)并继续在while循环中选择,直到找不到更多记录,然后将变量总数返回给调用函数。尽管在TSQL总和循环

SELECT [OrderUser].OrderUserId, ISNULL(SUM(total.FileSize), 0), ISNULL(SUM(total.CompressedFileSize), 0) 
FROM 
(
SELECT DISTINCT TOP(100) ProductSize.OrderUserId, ProductSize.FileInfoId, 
CAST(ProductSize.FileSize AS BIGINT) AS FileSize, 
CAST(ProductSize.CompressedFileSize AS BIGINT) AS CompressedFileSize 
FROM ProductSize WITH (NOLOCK) 
INNER JOIN [Version] ON ProductSize.VersionId = [Version].VersionId 
) AS total RIGHT OUTER JOIN [OrderUser] WITH (NOLOCK) ON total.OrderUserId = [OrderUser].OrderUserId 
WHERE NOT ([OrderUser].isCustomer = 1 AND [OrderUser].isEndOrderUser = 0 OR [OrderUser].isLocation = 1) 
AND [OrderUser].OrderUserId = 1 
GROUP BY [OrderUser].OrderUserId 
+2

如果你正在做的是总结它们,你为什么要把它们分成100个批次?或者你是否需要每批100行的总和? – 2010-06-03 19:41:57

+0

您正在使用哪个版本的SQL Server? – 2010-06-03 19:42:09

+0

我正在使用SQL 2005. 我想分批完成这项工作,以便我不使用SQL Server,因为此表包含10-30百万条记录 – RPS 2010-06-03 19:51:05

回答

2

根据聚集索引,如果它通过编号的id,然后使用下面的代码。如果按日期,则以10-60分钟的增量进行。继续对其他事情表现的眼睛,但是这个代码的可爱的部分是你可以就随时停止,如果你推的结果,永久临时表(真表,只是临时)

这里有一个例子:

declare @count int 
Declare @batch int 
declare @max int 

create table #temp (id int identity(1,1) primary key, Batch int, value int) 


select @max = max(OrderUserId), @count = 0, @batch = 1000 from table 

while (@count < @max) 
begin 

insert into #temp (batch,value) 
select @count, Sum(stuffs) 
from table 
where orderId >= @count 
and orderid < @count + @batch 

Set @count = @count + @batch 

waitfor delay ('00:00:01') 
Raiserror('On Batch %d',0,1,@Count) with nowait /* Will print progess */ 
end