Prob. query "Arithmetic overflow error converting expression to data t...

venerdì 11 marzo 2011 - 14.49

Arcer Profilo | Newbie

Salve a tutti
utilizziamo come DBMS SQL Server 2008 e come dataset un database conosciuto denominato TCP-H per fare test su prog. Data Wareouse .
Questo dataset presenta una tabella di questo tipo:
CREATE TABLE LINEITEM ( L_ORDERKEY INTEGER NOT NULL, L_PARTKEY INTEGER NOT NULL, L_SUPPKEY INTEGER NOT NULL, L_LINENUMBER INTEGER NOT NULL, L_QUANTITY DECIMAL(15,2) NOT NULL, L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL, L_DISCOUNT DECIMAL(15,2) NOT NULL, L_TAX DECIMAL(15,2) NOT NULL, L_RETURNFLAG CHAR(1) NOT NULL, L_LINESTATUS CHAR(1) NOT NULL, L_SHIPDATE DATE NOT NULL, L_COMMITDATE DATE NOT NULL, L_RECEIPTDATE DATE NOT NULL, L_SHIPINSTRUCT CHAR(25) NOT NULL, L_SHIPMODE CHAR(10) NOT NULL, L_COMMENT VARCHAR(44) NOT NULL);
La tabella contiene circa 6 milioni di tuple, eseguendo una query del tipo:
Select AVG(L_ORDERKEY) FROM dbo.LINEITEM

Restituisce il seguente errore:
Msg 8115, Level 16, State 2, Line 1 Arithmetic overflow error converting expression to data type int.

Abbiamo provato a risolvere il problema modificando la query in:
Select Cast (AVG(L_ORDERKEY)as BigInt) FROM dbo.LINEITEM
otteniamo sempre lo stesso errore.

Sapreste darmi una spiegazione, ed eventualmente una possibile soluzione a problema???

Grazie in anticipo

lbenaglia Profilo | Guru

>La tabella contiene circa 6 milioni di tuple, eseguendo una query
>del tipo:
>Select AVG(L_ORDERKEY) FROM dbo.LINEITEM
>
>Restituisce il seguente errore:
>Msg 8115, Level 16, State 2, Line 1
>Arithmetic overflow error converting expression to data type
>int.
>
>Abbiamo provato a risolvere il problema modificando la query
>in:
>Select Cast (AVG(L_ORDERKEY)as BigInt) FROM dbo.LINEITEM
>otteniamo sempre lo stesso errore.
>
>Sapreste darmi una spiegazione, ed eventualmente una possibile
>soluzione a problema???

Ciao,

Dai BOL: "AVG () computes the average of a set of values by dividing the sum of those values by the count of nonnull values. If the sum exceeds the maximum value for the data type of the return value an error will be returned".

Una brutta ed inefficiente soluzione cosiste nel castare la colonna PRIMA di applicare la funzione di aggregazione; una soluzione più efficiente (ma che ti porta ad occupare molto più spazio) è quella di modificare il data type della colonna della tabella via ALTER TABLE...ALTER COLUMN.

>Grazie in anticipo
Prego.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5