Precisão, escala e comprimento (Transact-SQL)

A precisão é o número de dígitos em um número. A escala é o número de dígitos à direita da casa decimal em um número. Por exemplo, o número 123,45 tem uma precisão de 5 e uma escala de 2.

No SQL Server, a precisão máxima padrão de tipos de dados numeric e decimal é 38. Em versões anteriores do SQL Server, o máximo padrão é 28.

O comprimento de um tipo de dados numérico é o número de bytes usado para armazenar o número. Comprimento de uma cadeia de caracteres ou tipo de dados de Unicode é o número de caracteres. O comprimento dos tipos de dados binary, varbinarye image é o número de bytes. Por exemplo, um tipo de dados int pode conter 10 dígitos, é armazenado em 4 bytes e não aceita casas decimais. O tipo de dados int tem uma precisão de 10, um comprimento de 4 e uma escala de 0.

Quando duas expressões char, varchar, binary ou varbinary são concatenadas, o comprimento da expressão resultante é a soma dos comprimentos das duas expressões de origem ou 8.000 caracteres, o que for menor.

Quando duas expressões nchar ou nvarchar são concatenadas, o comprimento da expressão resultante é a soma dos comprimentos das duas expressões de origem ou 4.000 caracteres, o que for menor.

Quando duas expressões com o mesmo tipo de dados mas com comprimentos diferentes são comparados usando UNION, EXCEPT ou INTERSECT, o comprimento resultante é o comprimento máximo das duas expressões.

A precisão e a escala dos tipos de dados numéricos além de decimal são fixos. Se um operador aritmético tiver duas expressões do mesmo tipo, o resultado terá o mesmo tipo de dados com precisão e escala definidas para esse tipo. Se um operador aritmético tiver duas expressões com tipos de dados numéricos diferentes, a regras de precedência do tipo de dados definirão os tipos de dados do resultado. O resultado terá a precisão e a escala definidas para seu tipo de dados.

A tabela a seguir define como a precisão e a escala do resultado são calculadas quando o resultado de uma operação é do tipo decimal. O resultado será decimal se uma das seguintes condições for verdadeira:

  • Ambas as expressões são decimal.

  • Uma expressão é decimal e a outra é um tipo de dados com uma precedência inferior a decimal.

As expressões de operandos são indicadas como expressão e1, com precisão p1 e escala s1, e expressão e2, com precisão p2 e escala s2. A precisão e a escala de qualquer expressão que não seja decimal serão aquelas definidas para o tipo de dados da expressão.

Operação

Precisão de resultado

Escala de 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

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

máx(s1, s2)

* A precisão e a escala de resultado têm um máximo absoluto de 38. Se a precisão de resultado for maior que 38, a escala correspondente será reduzida para evitar que alguma parte do resultado seja truncada.