2016-10-24 4 views
0

私は、tblFilterSumと呼ばれるtableを持ち、そのprimary keySumIDです。別のtabletblFilterProdであり、そのprimary keyProdIDです。両者の間には、tabletblFilterProdsInSumで表されるn:m関係があり、2次元は(SumID, ProdID)です。残念ながら、SumIDProdIDしたがって、私はSumIDforeign keyreferences tblFilterSum(SumID)foreign keyProdIDreferencestblFilterProd(ProdID)を作るために、スキーマを変更し、ないforeign keysました。 SumIDの場合はtblFilterProdsInSumに降順のインデックスを追加し、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

ProdIDintタイプです。このエラーの原因は何か不思議です。 SQL Serverはすべての値を追加してからcountで区切っていますか?

+1

を避けるために、例外に基づいてSumIDとPRODIDを加算した結果がintデータ型(HTTPSの範囲外である可能性があり:// msdn.microsoft.com/en-us/library/ms187745.aspx)。では、この場合のProdIDのSumIDの値は何ですか? –

+0

大きな整数です。 –

答えて

1

おそらく、あなたが要因の一つを再キャストすることができ数値オーバーフロー

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

それは私が必要なものです、ありがとう。 –

+1

@LajosArpadその犬は自分で噛んだ。 :) –

+0

@ LajosArpadこのような大きな整数を持っていることを考えると、これらのフィールドにはBIGINTを考慮する必要があります。 –

関連する問題