Precisione, scala e lunghezza (Transact-SQL)

La precisione è il numero di cifre di cui è composto un numero. La scala è il numero di cifre a destra del separatore decimale in un numero. Il numero 123,45, ad esempio, ha una precisione pari a 5 e una scala pari a 2.

In SQL Server la precisione massima predefinita dei tipi di dati numeric e decimal è 38. Nelle versioni precedenti di SQL Server, l'impostazione massima predefinita era 28.

La lunghezza di un tipo di dati numerico è il numero di byte utilizzati per l'archiviazione del numero. La lunghezza del tipo di dati stringa di caratteri o Unicode corrisponde al numero di caratteri. La lunghezza dei tipi di dati binary, varbinary e image corrisponde al numero di byte. Il tipo di dati int, ad esempio, può contenere 10 cifre, viene archiviato in 4 byte e non consente l'utilizzo del separatore decimale. Il tipo di dati int ha una precisione pari a 10, una lunghezza pari a 4 e una scala pari a 0.

Se si concatenano due espressioni di tipo char, varchar, binary o varbinary, la lunghezza dell'espressione risultante corrisponde al valore minore tra la somma delle lunghezze delle due espressioni di origine e 8.000 caratteri.

Se si concatenano due espressioni di tipo nchar o nvarchar, la lunghezza dell'espressione risultante corrisponde al valore minore tra la somma della lunghezza delle due espressioni di origine e 4.000 caratteri.

Se si confrontano due espressioni dello stesso tipo di dati ma di lunghezze diverse utilizzando UNION, EXCEPT o INTERSECT, la lunghezza risultante corrisponde alla lunghezza massima delle due espressioni.

La precisione e la scala dei tipi di dati numerici, ad eccezione di decimal, sono fisse. Se un operatore aritmetico collega due espressioni dello stesso tipo, il risultato è costituito dallo stesso tipo di dati, con la precisione e la scala corrispondenti a tale tipo. Se un operatore collega due espressioni con tipi di dati numerici diversi, il tipo di dati del risultato viene stabilito dalle regole relative alla precedenza dei tipi di dati. La precisione e la scala del risultato corrispondono a quelle definite per il tipo di dati.

Nella tabella seguente vengono descritti i criteri per il calcolo della precisione e della scala del risultato, quando il risultato di un'operazione è di tipo decimal. Il risultato è decimal in uno dei casi seguenti:

  • Entrambe le espressioni sono di tipo decimal.

  • Un'espressione è di tipo decimal e l'altra è di un tipo di dati con precedenza inferiore rispetto a decimal.

Le espressioni dell'operando sono definite come espressione e1, con precisione p1 e scala s1, e come espressione e2, con precisione p2 e scala s2. La precisione e la scala per qualsiasi espressione non di tipo decimal corrispondono alla precisione e alla scala definite per il tipo di dati dell'espressione.

Operazione

Precisione del risultato

Scala del risultato*

e1 + e2

max(s1, s2) + max(p1-s1, p2-s2) + 1

max(s1, s2)

e1 - e2

max(s1, s2) + max(p1-s1, p2-s2) + 1

max(s1, s2)

e1 * e2

p1 + p2 + 1

s1 + s2

e1 / e2

p1 - s1 + s2 + max(6, s1 + p2 + 1)

max(6, s1 + p2 + 1)

e1 { UNION | EXCEPT | INTERSECT } e2

max(s1, s2) + max(p1-s1, p2-s2)

max(s1, s2)

e1 % e2

min(p1-s1, p2 -s2) + max( s1,s2 )

max(s1, s2)

* La precisione e la scala del risultato hanno un valore massimo assoluto pari a 38. * Quando la precisione del risultato è superiore a 38, la scala corrispondente viene ridotta per evitare il troncamento della parte intera del risultato.