De la documentation en ligne :
POWER ( float_expression , y )
Arguments
float_expression Est une expression de type float ou d'un type qui peut être implicitement converti en float
L'implication est que tout ce que vous passez en tant que premier paramètre va être implicitement converti en a float(53)
avant l'exécution de la fonction. Mais ce n'est pas (toujours?) Le cas .
Si c'était le cas, cela expliquerait la perte de précision:
La conversion des valeurs flottantes qui utilisent la notation scientifique en décimal ou numérique est limitée aux valeurs de précision à 17 chiffres uniquement. Toute valeur avec une précision supérieure à 17 tours à zéro.
Par contre, le littéral 2.
est de type numeric
…:
DECLARE @foo sql_variant;
SELECT @foo = 2.;
SELECT SQL_VARIANT_PROPERTY(@foo, 'BaseType');
GO
| (Pas de nom de colonne) |
| : --------------- |
| numérique |
dbfiddle ici
… Et l'opérateur multiplier renvoie le type de données de l'argument avec la priorité la plus élevée .
Il apparaît que sur 2016 (SP1), toute la précision est conservée:
SELECT @@version;
GO
| (Pas de nom de colonne) |
| : ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------- |
| Microsoft SQL Server 2016 (SP1) (KB3182545) - 13.0.4001.0 (X64) <br> 28 octobre 2016 18:17:30 <br> Copyright (c) Microsoft Corporation <br> Express Edition (64 bits) sur Windows Server 2012 R2 Standard 6.3 <X64> (Build 9600:) (Hyperviseur) <br> |
SELECT POWER(2.,64.);
GO
| (Pas de nom de colonne) |
| : ------------------- |
| 18446744073709551616 |
dbfiddle ici
… Mais en 2014 (SP2), ils ne sont pas:
SELECT @@version;
GO
| (Pas de nom de colonne) |
| : ------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------ |
| Microsoft SQL Server 2014 (SP2) (KB3171021) - 12.0.5000.0 (X64) <br> 17 juin 2016 19:14:09 <br> Copyright (c) Microsoft Corporation <br> Express Edition (64 bits) sur Windows NT 6.3 <X64> (Build 9600:) (Hyperviseur) <br> |
SELECT POWER(2.,64.);
GO
| (Pas de nom de colonne) |
| : ------------------- |
| 18446744073709552000 |
dbfiddle ici