2012-11-02 8 views
5

Ich habe die folgende Abfrage:Wie umgehen Sie den arithmetischen Überlauffehler beim Konvertieren des Ausdrucks in den Datentyp int?

-- CTE to remove outliers, e.g. remove the fastest and slowest results 
;WITH MinMaxCTE AS 
(
    SELECT ServerName, CONVERT(VARCHAR(10), UpdatedOn, 101) AS [Date], Version, 
    MIN(JaguarStartupTime) AS MinStartTime, MAX(JaguarStartupTime) AS MaxStartTime 
    FROM dbo.MachineConfiguration (NOLOCK) 
    WHERE DomainLogin NOT IN (SELECT DomainLogin FROM dbo.SupportGroup) 
    GROUP BY ServerName, CONVERT(VARCHAR(10), UpdatedOn, 101), Version 
) 

SELECT AVG(mc.JaguarStartupTime) AS AverageTime 
    , COUNT(*) AS NumEntries 
    , mc.Version 
FROM #Eligible mc (NOLOCK) 
JOIN MinMaxCTE cte ON mc.ServerName = cte.ServerName 
    AND CONVERT(VARCHAR(10), mc.UpdatedOn, 101) = cte.[Date] 
    AND mc.Version = cte.Version 
    AND mc.JaguarStartupTime <> cte.MinStartTime 
    AND mc.JaguarStartupTime <> cte.MaxStartTime 
GROUP BY mc.Version 
ORDER BY Version DESC, AVG(mc.JaguarStartupTime) ASC 

Die Definition der #Eligible temporäre Tabelle ist

create table #Eligible (
    Version nvarchar(50), JaguarStartupTime int, 
    ServerName nvarchar(50), UpdatedOn datetime) 

Egal welchen Zustand oder Aggregation ich kommentieren Sie, ich bekomme immer folgende Fehlermeldung: Arithmetic overflow error converting expression to data type int.

Wohin kann ich von hier gehen? Wie debugge ich das weiter?

EDIT: Beispieldaten

Version JaguarStartupTime ServerName  UpdatedOn 
6.4.6.082  16040   NewOrleansLA 2012-08-08 12:34:12.330 
6.5.1.012  40390   BatonRougeLA 2012-08-08 18:33:17.440 
6.5.1.012  48379   HonoluluHI  2012-08-09 04:42:50.453 
+1

Sie haben mehrere Aggregationen in dieser Abfrage, welche wirft den Fehler? Können Sie einige Beispieldaten posten? Was ist die Tabellenstruktur von 'dbo.MachineConfiguration'? – Taryn

+0

@bluefeet Die Struktur von 'MachineConfiguration' entspricht exakt der #Empfindlichkeit der temporären Tabelle. Tatsächlich ist die temporäre Tabelle eine Teilmenge der 'MachineConfiguration'. – AngryHacker

+0

Wenn Sie * aus der CTE auswählen, bevor die Joins, usw. erhalten Sie irgendwelche Fehler? – Taryn

Antwort

5

Haben Sie versucht, Ihre jaguarstartup mal zu einem Bigint in Ihrem avg Aggregat Gießen wie so ...

AVG (CAST (mc.JaguarStartupTime AS BIGINT))

Dies sollte den arithmetischen Überlauf aussortieren.

Um den Durchschnittswert zu berechnen, muss der Server zuerst alle Intets summieren können. Daher muss der Datentyp, den Sie mitteln, die Summe dieser Werte speichern können, selbst wenn die zurückgegebene Antwort innerhalb des Bereichs liegt von einem int

+0

Danke, ich habe es gerade herausgefunden. Aber warum muss ich das tun? Die größte 'JaguarStartupTime' kann sein int. Warum muss ich es konvertieren? – AngryHacker

+0

Danke für die Erklärung. – AngryHacker

Verwandte Themen