Precisión, escala y longitud (Transact-SQL)Precision, scale, and Length (Transact-SQL)

SE APLICA A: síSQL Server noAzure SQL Database noAzure SQL Data Warehouse noAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server noAzure SQL Database noAzure SQL Data Warehouse noParallel Data Warehouse

La precisión es el número de dígitos de un número.Precision is the number of digits in a number. La escala es el número de dígitos situados a la derecha de la coma decimal de un número.Scale is the number of digits to the right of the decimal point in a number. Por ejemplo, el número 123,45 tiene una precisión de 5 y una escala de 2.For example, the number 123.45 has a precision of 5 and a scale of 2.

En SQL ServerSQL Server, la precisión máxima predeterminada de los tipos de datos numéricos y decimales es 38.In SQL ServerSQL Server, the default maximum precision of numeric and decimal data types is 38. En versiones anteriores de SQL ServerSQL Server, el valor máximo predeterminado es 28.In earlier versions of SQL ServerSQL Server, the default maximum is 28.

La longitud de un tipo de datos numérico es el número de bytes utilizados para almacenar el número.Length for a numeric data type is the number of bytes that are used to store the number. Para varchar y char, la longitud de una cadena de caracteres es el número de bytes.For varchar and char, the length of a character string is the number of bytes. Para nvarchar y nchar, la longitud de una cadena de caracteres es el número de pares de bytes.For nvarchar and nchar, the length of the character string is the number of byte-pairs. La longitud de los tipos de datos binary, varbinary e image es el número de bytes.The length for binary, varbinary, and image data types is the number of bytes. Por ejemplo, un tipo de datos int que puede contener 10 dígitos se almacena en 4 bytes y no acepta puntos decimales.For example, an int data type can hold 10 digits, is stored in 4 bytes, and doesn't accept decimal points. El tipo de datos int tiene una precisión de 10, una longitud de 4 y una escala de 0.The int data type has a precision of 10, a length of 4, and a scale of 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, hasta 8000 bytes.When concatenating two char, varchar, binary, or varbinary expressions, the length of the resulting expression is the sum of the lengths of the two source expressions, up to 8,000 bytes.

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, hasta 4000 pares de bytes.When concatenating two nchar or nvarchar expressions, the length of the resulting expression is the sum of the lengths of the two source expressions, up to 4,000 byte-pairs.

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 mayor de las dos expresiones.When comparing two expressions of the same data type but different lengths by using UNION, EXCEPT, or INTERSECT, the resulting length is the longer of the two expressions.

La precisión y la escala de los tipos de datos numéricos, además de los decimales, son fijas.The precision and scale of the numeric data types besides decimal are fixed. 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.When an arithmetic operator has two expressions of the same type, the result has the same data type with the precision and scale defined for that type. 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.If an operator has two expressions with different numeric data types, the rules of data type precedence define the data type of the result. El resultado tiene la precisión y la escala definidas para el tipo de datos que le corresponde.The result has the precision and scale defined for its data type.

En la tabla siguiente se define la forma de calcular la precisión y la escala del resultado cuando el resultado de una operación es de tipo decimal.The following table defines how the precision and scale of the result are calculated when the result of an operation is of type decimal. El resultado es decimal cuando:The result is decimal when either:

  • Ambas expresiones son de tipo decimal.Both expressions are decimal.
  • Una expresión es decimal y la otra es de un tipo de datos con una prioridad menor que decimal.One expression is decimal and the other is a data type with a lower precedence than 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.The operand expressions are denoted as expression e1, with precision p1 and scale s1, and expression e2, with precision p2 and scale s2. La precisión y la escala de cualquier expresión que no sea decimal son la precisión y la escala definidas para el tipo de datos de la expresión.The precision and scale for any expression that is not decimal is the precision and scale defined for the data type of the expression. La función max(a,b) indica que se tome el valor mayor entre "a" y "b".The function max(a,b) means the following: take the greater value of "a" or "b". De forma similar, min(a,b) indica que se tome el valor menor entre "a" y "b".Similarly, min(a,b) indicates to take the smaller value of "a" or "b".

OperaciónOperation Precisión del resultadoResult precision Escala del resultado *Result scale *
e1 + e2e1 + e2 máx(s1, s2) + máx(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 máx(s1, s2)max(s1, s2)
e1 - e2e1 - e2 máx(s1, s2) + máx(p1-s1, p2-s2) + 1max(s1, s2) + max(p1-s1, p2-s2) + 1 máx(s1, s2)max(s1, s2)
e1 * e2e1 * e2 p1 + p2 + 1p1 + p2 + 1 s1 + s2s1 + s2
e1 / e2e1 / e2 p1 - s1 + s2 + máx(6, s1 + p2 + 1)p1 - s1 + s2 + max(6, s1 + p2 + 1) máx(6, s1 + p2 + 1)max(6, s1 + p2 + 1)
e1 { UNION | EXCEPT | INTERSECT } e2e1 { UNION | EXCEPT | INTERSECT } e2 máx(s1, s2) + máx(p1-s1, p2-s2)max(s1, s2) + max(p1-s1, p2-s2) máx(s1, s2)max(s1, s2)
e1 % e2e1 % e2 min(p1-s1, p2 -s2) + max( s1,s2 )min(p1-s1, p2 -s2) + max( s1,s2 ) máx(s1, s2)max(s1, s2)

* La precisión del resultado y la escala tienen un máximo absoluto igual a 38.* The result precision and scale have an absolute maximum of 38. Cuando la precisión de un resultado es mayor que 38, se reduce a 38, y la escala correspondiente se reduce para intentar evitar que la parte entera del resultado se trunque.When a result precision is greater than 38, it's reduced to 38, and the corresponding scale is reduced to try to prevent truncating the integral part of a result. En algunos casos, como en la multiplicación o la división, el factor de escala no se reduce para conservar la precisión decimal, aunque se pueda generar un error por desbordamiento.In some cases such as multiplication or division, scale factor won't be reduced, to maintain decimal precision, although the overflow error can be raised.

Además de las operaciones de suma y resta, necesitamos que los sitios max(p1 - s1, p2 - s2) almacenen las partes enteras de los números decimales.In addition and subtraction operations, we need max(p1 - s1, p2 - s2) places to store integral part of the decimal number. Si no hay suficiente espacio para almacenarlas, es decir, max(p1 - s1, p2 - s2) < min(38, precision) - scale, la escala se reduce para proporcionar suficiente espacio para integrar la parte entera.If there isn't enough space to store them that is, max(p1 - s1, p2 - s2) < min(38, precision) - scale, the scale is reduced to provide enough space for integral part. La escala resultante es MIN(precision, 38) - max(p1 - s1, p2 - s2), con lo que la parte fraccionaria se puede redondear para que entre en la escala resultante.Resulting scale is MIN(precision, 38) - max(p1 - s1, p2 - s2), so the fractional part might be rounded to fit into the resulting scale.

En las operaciones de multiplicación y división necesitamos que los sitios precision - scale almacenen la parte entera del resultado.In multiplication and division operations, we need precision - scale places to store the integral part of the result. La escala se puede reducir utilizando las reglas siguientes:The scale might be reduced using the following rules:

  1. La escala resultante se reduce a min(scale, 38 - (precision-scale)) si la parte entera es menor que 32, porque no puede ser mayor que 38 - (precision-scale).The resulting scale is reduced to min(scale, 38 - (precision-scale)) if the integral part is less than 32, because it can't be greater than 38 - (precision-scale). En este caso, el resultado se puede redondear.Result might be rounded in this case.
  2. La escala no cambia si es inferior a 6 y si la parte entera es mayor que 32.The scale won't be changed if it's less than 6 and if the integral part is greater than 32. En este caso, se puede producir un error de desbordamiento porque no cabe en el decimal (38, escala).In this case, overflow error might be raised if it can't fit into decimal(38, scale)
  3. La escala se establece en 6 si es mayor que 6 y si la parte entera es mayor que 32.The scale will be set to 6 if it's greater than 6 and if the integral part is greater than 32. En este caso, se reducen tanto la parte entera como la escala y el tipo resultante es decimal (38,6).In this case, both integral part and scale would be reduced and resulting type is decimal(38,6). El resultado se tiene que redondear hasta 6 puntos decimales o se producirá un error si la parte entera no cabe en 32 dígitos.Result might be rounded to 6 decimal places or the overflow error will be thrown if the integral part can't fit into 32 digits.

EjemplosExamples

La siguiente expresión devuelve resultados 0.00000090000000000 sin redondear, porque el resultado puede caber en decimal(38,17):The following expression returns result 0.00000090000000000 without rounding, because result can fit into decimal(38,17):

select cast(0.0000009000 as decimal(30,20)) * cast(1.0000000000 as decimal(30,20)) [decimal 38,17]

En este caso, la precisión es 61 y la escala es 40.In this case precision is 61, and scale is 40. La parte entera (precision-scale = 21) es menor que 32, por lo que este es el caso (1) de las reglas de multiplicación y la escala se calcula como min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17.Integral part (precision-scale = 21) is less than 32, so this case is case (1) in multiplication rules and scale is calculated as min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. El tipo de resultado es decimal(38,17).Result type is decimal(38,17).

La siguiente expresión devuelve resultados 0.000001 que caben en decimal(38,6):The following expression returns result 0.000001 to fit into decimal(38,6):

select cast(0.0000009000 as decimal(30,10)) * cast(1.0000000000 as decimal(30,10)) [decimal(38, 6)]

En este caso, la precisión es 61 y la escala es 20.In this case precision is 61, and scale is 20. La escala es mayor que 6 y la parte entera (precision-scale = 41) es mayor que 32.Scale is greater than 6 and integral part (precision-scale = 41) is greater than 32. Este es el caso (3) de las reglas de multiplicación y el tipo de resultado es decimal(38,6).This case is case (3) in multiplication rules and result type is decimal(38,6).

Vea tambiénSee also

Expresiones (Transact-SQL)Expressions (Transact-SQL)
Tipos de datos (Transact-SQL)Data Types (Transact-SQL)