2013-04-05 14 views
14

Ho semplicemente domande sul tipo DECIMAL (e forse NUMERIC) in SQL Server 2008 R2.Lunghezza scala decimale di SQL Server: può essere o deve essere?

MSDN detto:

(scala) Il numero massimo di cifre decimali che è possibile archiviare a destra del punto decimale. La scala deve essere un valore compreso tra 0 e p.

capisco questo modo seguente:

  • se ho DECIMAL(10, 5) - Sono in grado di memorizzare 12.345,12,345 mila o 12.345.678,91.
  • se devo DECIMAL(5, 5) - posso avere 12345 o 1234.5 o 1.2345, ecc ...

È chiaro?

Ma ho ottenuto questo messaggio di errore:

SELECT CAST(2.8514 AS DECIMAL(5,5)) 

errore di overflow aritmetico conversione numerica di tipo di dati numerico.

Ho pensato 5,5 significa che posso avere fino a 5 cifre e fino a 5 PU BE ESSERE a destra del punto decimale.

Mentre cercavo:

SELECT CAST(12.851 AS DECIMAL(6,5)) - overflows too 

tuttavia

SELECT CAST(1.23456 AS DECIMAL(6,5)) - is OK. 

Allora, qual è la verità?

DECIMAL(a,b) dice che posso avere fino a un numero e JUST b di loro sono giusti al punto decimale (e lì resto a-b a sinistra al punto dec.)?

Sono davvero confuso sull'istruzione in doc che viene copiata ovunque. Per favore, prenditi un po 'e spiegami questa semplice cosa.

Molto grazie!

+0

'DECIMALE (5,5)' significa: 5 cifre totali, 5 delle quali ** dopo ** il punto decimale, quindi in pratica non si tratta di un numero valido ...'DECIMAL (10,5)' significa: totale di 10 cifre, 5 delle quali ** dopo ** il punto decimale (e quindi 5 prima del punto decimale, anche). Non è un *** PU BE ESSERE *** dopo il punto decimale - è un *** DOPO *** la specifica del punto decimale –

+2

@marc_s Credo che sia esattamente il motivo per cui l'OP è confuso: la [documentazione] (http: //msdn.microsoft.com/en-us/library/ms187746.aspx) usa solo la parola "can", quindi non è proprio chiaro che decimale (5,5) "riserva" 5 cifre dopo il punto decimale, sia che tu li 'uso' o meno. Forse è ovvio per le persone più inclini alla matematica, ovviamente (non sono una di quelle persone). – Pondlife

+0

@Pondlife hai ragione a proposito della confusione della documentazione. Nel 2013, ho inviato una segnalazione di bug a MSDN e l'hanno modificata nella dicitura che ho suggerito in http://stackoverflow.com/questions/12207222/decimal-10-9-variable-cant-hold-the-number- 50-sql-server-2008. –

risposta

19

Il modo più semplice per pensarlo (per me) è che la precisione è il numero totale di cifre, di cui la scala è il numero di cifre a destra del punto decimale. Quindi DECIMAL(p,s) significa cifre p-s a sinistra del punto e cifre s a destra del punto.

Questo spiega tutti gli errori di conversione che stai vedendo: il 2.8514 non può essere decimal(5,5) perché p-s = 0; 12.851 non può essere decimal(6,5) perché p-s = 1 e così via.