2010-06-03 2 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 рядов по отдельности? –

+0

Какую версию SQL Server вы используете? –

+0

Я использую SQL 2005. Я хочу сделать сумму в пакетах, чтобы я не сливал SQL-сервер, так как эта таблица содержит 10-30 миллионов записей. – RPS

ответ

2

В зависимости от кластерного индекса, если его пронумерованным идентификатором, используйте код ниже. Если его по дате, пойдите с шагом 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 
Смежные вопросы