Precisione decimal nei SSIS

giovedì 02 ottobre 2008 - 13.36

stepic77 Profilo | Newbie

Eccomi di nuovo...
Nel Database (sql2005) ho tre tabelle
TABLE1 --> CODICE (int), IMPORTO1 (decimal(24,12))
TABLE2 --> CODICE (int), IMPORTO2 (decimal(24,12))
TABLE3 --> CODICE (int), IMPORTO_MOLTIPLICATO (decimal(24,12))


Nel SSIS carico in 2 derivate le tabelle TABLE1 e TABLE2, con un merge join faccio per lo stesso CODICE una moltiplicazione fra IMPORTO1 e IMPORTO2 e scrivo il risultato sulla TABLE3 (IMPORTO_MOLTIPLICATO). Vado sul DB e scopro che perdo la precisione sulla moltiplicazione...

PS. Le variabili definite nelle derivate sono Numeric con precisione 26,scala 12

lbenaglia Profilo | Guru

>Nel SSIS carico in 2 derivate le tabelle TABLE1 e TABLE2, con
>un merge join faccio per lo stesso CODICE una moltiplicazione
>fra IMPORTO1 e IMPORTO2 e scrivo il risultato sulla TABLE3 (IMPORTO_MOLTIPLICATO).
>Vado sul DB e scopro che perdo la precisione sulla moltiplicazione...
>

Il problema non è dei SSIS, ma tuo come ho già avuto modo di spiegarti in questo thread:
http://www.dotnethell.it/forum/messages.aspx?ThreadID=25544

Non puoi utilizzare una precision ed uno scale così elevati e pretendere che operazioni di divisione e moltiplicazione non comportino una perdita di precisione.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

stepic77 Profilo | Newbie

Trovato il problema, sull'update del SSIS moltiplicavo erroneamente (decimal * decimal * float)

Il fatto che la precisione di 2 numeri decimal moltiplicati è data da
P= p1 + p2 +1; S= s1 + s2
è indiscutibile

Nel mio caso, la moltiplicazione dei 2 decimal non supererà mai le 12 cifre decimali e la sensibilità dei decimali è fino all' 11 cifra
per questo motivo ho utilizzato dei campi DECIMAL(24,12).

DECLARE @A DECIMAL(24,12) DECLARE @B DECIMAL(24,12) DECLARE @C DECIMAL(24,12) SET @A = 35,245644 SET @B = 565141,1423 SET @C = @A * @B / 100 PRINT(@C) --199187.635112591412

in alternativa cosa potevo fare?



(ovvio che un operazione di questo tipo)

DECLARE @A DECIMAL(24,12) DECLARE @B DECIMAL(24,12) DECLARE @C DECIMAL(24,12) DECLARE @D DECIMAL(24,12) SET @A = 0.000000000001 SET @B = 1.000000000001 print(@A * @B)

non otterrò la giusta precisione
--0.000000000001000000000001
ma
--0.000000000001

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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5