Na documentação online :
POWER ( float_expression , y )
Argumentos
float_expression É uma expressão do tipo float ou de um tipo que pode ser implicitamente convertido em float
A implicação é que tudo o que você passar como o primeiro parâmetro será implicitamente convertido em a float(53)
antes que a função seja executada. No entanto, este não é (sempre?) O caso .
Se fosse o caso, explicaria a perda de precisão:
A conversão de valores flutuantes que usam notação científica em decimal ou numérico é restrita apenas a valores de precisão de 17 dígitos. Qualquer valor com precisão maior que 17 arredondamentos para zero.
Por outro lado, o literal 2.
é do tipo numeric
…:
DECLARE @foo sql_variant;
SELECT @foo = 2.;
SELECT SQL_VARIANT_PROPERTY(@foo, 'BaseType');
GO
| (Sem nome da coluna) |
| : --------------- |
| numérico |
dbfiddle aqui
… E o operador multiply retorna o tipo de dados do argumento com maior precedência .
Parece que em 2016 (SP1), toda a precisão é mantida:
SELECT @@version;
GO
| (Sem nome da coluna) |
| : ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------- |
| Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) <br> 28 de outubro de 2016 18:17:30 <br> Copyright (c) Microsoft Corporation <br> Express Edition (64 bits) no Windows Server 2012 R2 Padrão 6.3 <X64> (Compilação 9600:) (Hypervisor) <br> |
SELECT POWER(2.,64.);
GO
| (Sem nome da coluna) |
| : ------------------- |
| 18446744073709551616 |
dbfiddle aqui
… Mas em 2014 (SP2), eles não são:
SELECT @@version;
GO
| (Sem nome da coluna) |
| : ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------ |
| Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) <br> 17 de junho de 2016 19:14:09 <br> Copyright (c) Microsoft Corporation <br> Express Edition (64 bits) no Windows NT 6.3 <X64> (Compilação 9600:) (Hypervisor) <br> |
SELECT POWER(2.,64.);
GO
| (Sem nome da coluna) |
| : ------------------- |
| 18446744073709552000 |
dbfiddle aqui