Precisión, escala y longitud (Transact-SQL)

La precisión es el número de dígitos de un número. La escala es el número de dígitos situados a la derecha de la coma decimal de un número. Por ejemplo, el número 123,45 tiene una precisión de 5 y una escala de 2.

En SQL Server, la precisión máxima predeterminada de los tipos de datos numeric y decimal es 38. En versiones anteriores de SQL Server, el valor máximo predeterminado es 28.

La longitud de un tipo de datos numérico es el número de bytes utilizados para almacenar el número. La longitud para una cadena de caracteres o tipo de datos Unicode es el número de caracteres. La longitud para los tipos de datos binary, varbinary y image es el número de bytes. Por ejemplo, un tipo de datos int que puede contener 10 dígitos se almacena en 4 bytes y no acepta coma decimal. El tipo de datos int tiene una precisión de 10, una longitud de 4 y una escala de 0.

Cuando se concatenan dos expresiones char, varchar, binary o varbinary, la longitud de la expresión resultante es la suma de las longitudes de las dos expresiones de origen u 8.000 caracteres, lo que sea menor.

Cuando se concatenan dos expresiones nchar o nvarchar, la longitud de la expresión resultante es la suma de las longitudes de las dos expresiones de origen o 4.000 caracteres, lo que sea menor.

Cuando se comparan dos expresiones del mismo tipo de datos pero de distintas longitudes mediante UNION, EXCEPT o INTERSECT, la longitud resultante es la longitud máxima de las dos expresiones.

La precisión y la escala de los tipos de datos numéricos, excepto decimal, son fijas. Si un operador aritmético tiene dos expresiones del mismo tipo, el resultado tiene el mismo tipo de datos con la precisión y la escala definidas para ese tipo de datos. Si un operador tiene dos expresiones con tipos de datos numéricos diferentes, las reglas de prioridad de tipos de datos definen el tipo de datos del resultado. El resultado tiene la precisión y la escala definidas para el tipo de datos que le corresponde.

Esta tabla define cómo se calculan la precisión y la escala del resultado de la operación cuando éste es de tipo decimal. El resultado es decimal cuando se cumple alguna de las siguientes condiciones:

  • Ambas expresiones son de tipo decimal.

  • Una expresión es decimal y la otra es de un tipo de datos con una prioridad menor que decimal.

Las expresiones de operando se denotan como expresión e1, con precisión p1 y escala s1, y expresión e2, con precisión p2 y escala s2. La precisión y la escala de cualquier expresión que no sea decimal es la precisión y la escala definidas para el tipo de datos de la expresión.

Operación

Precisión del resultado

Escala del resultado *

e1 + e2

máx(s1, s2) + máx(p1-s1, p2-s2) + 1

máx(s1, s2)

e1 - e2

máx(s1, s2) + máx(p1-s1, p2-s2) + 1

máx(s1, s2)

e1 * e2

p1 + p2 + 1

s1 + s2

e1 / e2

p1 - s1 + s2 + máx(6, s1 + p2 + 1)

máx(6, s1 + p2 + 1)

e1 { UNION | EXCEPT | INTERSECT } e2

máx(s1, s2) + máx(p1-s1, p2-s2)

máx(s1, s2)

e1 % e2

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

máx(s1, s2)

* La precisión del resultado y la escala tiene un máximo absoluto igual a 38. Cuando la precisión de un resultado es mayor que 38, la escala correspondiente se reduce para evitar que la parte entera del resultado se trunque.