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

Aplica-se a:SQL ServerBase de Dados SQL do AzureAzure SQL Managed InstanceAzure Synapse AnalyticsEndpoint 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).