Partilhar via


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

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Precisão é o número de dígitos de um número. Escala é o número de dígitos à direita da vírgula decimal de um número. Por exemplo, o número 123.45 tem uma precisão de e uma escala de 52 .

No SQL Server, a precisão máxima padrão dos tipos de dados numéricos e decimais é 38.

O comprimento de um tipo de dados numérico é o número de bytes usados para armazenar o número. Para varchar e char, o comprimento de uma cadeia de caracteres é o número de bytes. Para nvarchar e nchar, o comprimento da cadeia de caracteres é o número de pares de bytes. O comprimento para os tipos de dados binários, varbinários e de imagem é 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 você concatena duas expressões char, varchar, binary, ouvarbinary , o comprimento da expressão resultante é a soma dos comprimentos das duas expressões de origem, até 8.000 bytes.

  • Quando você concatena duas expressões nchar ou nvarchar , o comprimento da expressão resultante é a soma dos comprimentos das duas expressões de origem, até 4.000 pares de bytes.

  • Quando você compara duas expressões do mesmo tipo de dados, mas comprimentos diferentes, usando UNION, EXCEPTou INTERSECT, o comprimento resultante é o maior das duas expressões.

Remarks

A precisão e a escala dos tipos de dados numéricos além do decimal são fixas. Quando um operador aritmético tem duas expressões do mesmo tipo, o resultado tem o mesmo tipo de dados com a precisão e a escala definidas para esse tipo. Se um operador tiver duas expressões com tipos de dados numéricos diferentes, as regras de precedência do tipo de dados definirão o tipo de dados do resultado. O resultado tem a precisão e a escala definidas para o 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 é decimal quando:

  • Ambas as expressões são decimais.
  • Uma expressão é decimal e a outra é um tipo de dados com uma precedência menor do que decimal.

As expressões do operando são denotadas 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 para qualquer expressão que não seja decimal são a precisão e a escala definidas para o tipo de dados da expressão. A função max(a, b) indica tomar o maior valor de a ou b. Da mesma forma, min(a, b) indica tomar o menor valor de a ou b.

Operation Precisão dos resultados Escala de resultados 1
e1 + e2 máx(s1, s2) + máx(p1 - s1, p2 - s2) + 1 max(s1, s2)
e1 - e2 máx(s1, s2) + máx(p1 - s1, p2 - s2) + 1 max(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 { UNIÃO | EXCETO | CRUZAR } e2 máx(s1, s2) + máx(p1 - s1, p2 - s2) max(s1, s2)
e1 % e2 min(p1 - s1, p2 - s2) + máx(s1, s2) max(s1, s2)

1 A precisão e a escala do resultado têm um máximo absoluto de 38. Quando uma precisão de resultado é maior que 38, ela é reduzida para 38, e a escala correspondente é reduzida para tentar evitar truncar a parte integral de um resultado. Em alguns casos, como multiplicação ou divisão, o fator de escala não é reduzido, para manter a precisão decimal, embora o erro de estouro possa ser aumentado.

Além e operações de subtração, precisamos de max(p1 - s1, p2 - s2) lugares para armazenar a parte integral do número decimal. Se não houver espaço suficiente para armazená-los (ou seja, max(p1 - s1, p2 - s2) < min(38, precision) - scale), a escala é reduzida para fornecer espaço suficiente para a parte integral. A escala resultante é min(precision, 38) - max(p1 - s1, p2 - s2), de modo que a parte fracionária pode ser arredondada para caber na escala resultante.

Nas operações de multiplicação e divisão, precisamos de precision - scale lugares para armazenar a parte integral do resultado. A escala pode ser reduzida usando as seguintes regras:

  1. A escala resultante é reduzida para se a parte integral for inferior a min(scale, 38 - (precision-scale)) 32, porque não pode ser maior que 38 - (precision-scale). Neste caso, o resultado pode ser arredondado.
  2. A escala não é alterada se for inferior a 6 e se a parte integrante for superior a 32. Nesse caso, um erro de estouro pode ser gerado se não puder caber em decimal(38, escala).
  3. A escala é definida como 6 se for maior que 6 e se a parte integrante for maior que 32. Neste caso, tanto a parte integral como a escala seriam reduzidas e o tipo resultante seria decimal(38, 6). O resultado pode ser arredondado para 7 casas decimais, ou o erro de estouro é lançado se a parte integral não caber em 32 dígitos.

Examples

A expressão a seguir retorna o resultado 0.00000090000000000 sem arredondamento, porque o resultado pode caber em decimal(38, 17):

SELECT CAST(0.0000009000 AS DECIMAL(30, 20)) * CAST(1.0000000000 AS DECIMAL(30, 20)) [decimal(38, 17)];

Neste caso, a precisão é 61, e a escala é 40.

A parte (precision-scale = 21) integral é inferior a 32, portanto este caso é o primeiro caso nas regras de multiplicação, e a escala é calculada como min(scale, 38 - (precision-scale)) = min(40, 38 - (61-40)) = 17. O tipo de resultado é decimal(38, 17).

A expressão a seguir retorna o resultado 0.000001 para caber em decimal(38, 6):

SELECT CAST(0.0000009000 AS DECIMAL(30, 10)) * CAST(1.0000000000 AS DECIMAL(30, 10)) [decimal(38, 6)];

Neste caso, a precisão é 61, e a escala é 20.

A escala é maior que 6 e a parte integral (precision-scale = 41) é maior que 32. Este caso é o terceiro caso nas regras de multiplicação, e o tipo de resultado é decimal(38, 6).

Consulte também