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.