2016-10-24 4 views
0

У меня есть table под названием tblFilterSum и его primary key is SumID. Другой table - tblFilterProd, а его primary key - ProdID. Между ними существует отношение n: m, представленное tabletblFilterProdsInSum, которое имеет двумерный primary key(SumID, ProdID). К сожалению, SumID и ProdID не foreign keys были, поэтому я изменил схему, чтобы сделать SumIDforeign key, который references tblFilterSum(SumID) и ProdID другой foreign key, который referencestblFilterProd(ProdID). Я добавил нисходящий индекс к tblFilterProdsInSum за SumID и еще один нисходящий индекс для ProdID. Теперь я намерен измерять скорость отбора и я написал следующий скрипт:Почему avg выдает ошибку?

declare @start datetime; 
set @start = CURRENT_TIMESTAMP; 
declare @index int; 
set @index = 0; 
while (@index < 1000) 
begin 
select avg(tblFilterProdsInSum.SumID + tblFilterProdsInSum.ProdID) 
from tblFilterSum 
join tblFilterProdsInSum 
on tblFilterSum.SumID = tblFilterProdsInSum.SumID 
join tblFilterProd 
on tblFilterProdsInSum.ProdID = tblFilterProd.ProdID 
set @index = @index + 1; 
end 
declare @end datetime; 
set @end = CURRENT_TIMESTAMP; 
select @start, @end, @end - @start; 

Это выдает следующее сообщение об ошибке:

Arithmetic overflow error converting expression to data type int.

Оба SumID и ProdID имеют int типа. Интересно, в чем причина этой ошибки. SQL Server добавляет все значения, а затем делит на count?

+1

На основе исключения в результате добавления SumID и PRODID, вероятно, за пределами диапазона целого типа данных (https: // msdn.microsoft.com/en-us/library/ms187745.aspx). Итак, каковы значения SumID в ProdID в этом случае? –

+0

Это большие целые числа. –

ответ

1

Возможно, вы можете повторно бросить один из ваших факторов, чтобы избежать числового переполнения

select avg(cast(tblFilterProdsInSum.SumID as float) + tblFilterProdsInSum.ProdID) 
+0

Вот что мне нужно, спасибо. –

+1

@ LajosArpad. Это была собака. :) –

+0

@LajosArpad Учитывая, что у вас есть такие большие целые числа, вы можете рассмотреть BIGINT для этих полей. –

Смежные вопросы