none
UPDATE campo/i decimal RRS feed

  • Domanda

  • Salve a tutti.

    Ho una tabella in SQL Server Express Ed. 2012 con più campi decimal con parametri di precisione e scala differenti.

    Mi sono accorto solo ora che quando vado ad eseguire l'update di un nuovo valore, mediante l'esecuzione di un Stored Procedure richiamata ed eseguita mediante codice c#, il valore che viene scritto nel/i campo/i viene sempre approssimato ad un intero.

    I valori di input li ricevo attraverso un Request.Form di una chiamata Ajax. Ho provato a convertire il valore sia in Decimal che in Single, mediante l'uso della classe Convert, ma il risultato non varia.

    Ho riscontrato che il valore che assegno al parametro della Stored Procedure è corretto (ad es. 48.573569), però dopo l'esecuzione delle Stored nel campo trovo il valore 49. Il campo in questione è un Decimal(9,6).

    A titolo di test ho scritto ed eseguito il seguente codice t-sql che riproduce il problema.

    DECLARE @p decimal
    SET @p = 48.573569

    declare @t as table (col1 decimal(9,6))

    INSERT INTO @t (col1) VALUES (@p)

    select * from @t

    Qualcuno sa fornirmi qualche dritta in merito? Grazie

      ======================================================

    AGGIORNAMENTO

    Al momento una soluzione che funziona è il cambio del tipo di dato della colonna della tabella da decimal a float.

      ======================================================

    SOLUZIONE

    Nel mio caso specifico il problema era la mancanza della definizione dei valori si scala e precisione sulla dichiarazione del parametro (@p). 

    Modificando la dichiarazione in:

    DECLARE @p decimal(9,6) => Funziona perfettamente

    Grazie a tutti 


    Sk



    • Modificato skrauso martedì 15 giugno 2021 09:53
    martedì 15 giugno 2021 09:14

Tutte le risposte

  • Otiimo post!

    grazie,Skrauso

    Saluti,Nikola

    mercoledì 16 giugno 2021 05:06
  • ======================================================

    SOLUZIONE

    Nel mio caso specifico il problema era la mancanza della definizione dei valori si scala e precisione sulla dichiarazione del parametro (@p). 

    Modificando la dichiarazione in:

    DECLARE @p decimal(9,6) => Funziona perfettamente



    Grazie per aver condiviso qui la soluzione!

    Aggiungo una considerazione sul tipo di dato float, essendo un "approximate-number data type" il mio consiglio è quello di utilizzarlo solo nei casi in cui è strettamente richiesto come per esempio per il DB di una applicazione scientifica.

    Il mio consiglio è quello di non utilizzarlo per colonne che memorizzano per esempio quantità, giacenze o importi (su nuovi progetti ovviamente.. se lo avete "ereditato" è un altro discorso), oltre al "problema" dato dall'approssimazione il tipo di dato decimal(x, y) è mediamente più performante.

    Ciao!


    Sergio Govoni

    Microsoft Data Platform MVP | MVP Profile | English Blog | Twitter | LinkedIn

    domenica 27 giugno 2021 09:33
    Moderatore