オンラインドキュメントから:
POWER ( float_expression , y )
引数
float_expressionは、float型または暗黙的にfloatに変換できる型の式です
含意は何でもあなたが最初のパラメータとして渡すことは暗黙的にキャストされようとしているということであるfloat(53)
前に、関数が実行されます。しかし、これは(常に?)そうではありません。
その場合、精度の低下を説明できます。
科学表記法を使用する浮動小数点値の10進数または数値への変換は、精度17桁の値のみに制限されています。17を超える精度を持つ値はゼロに丸められます。
一方、リテラルが2.
タイプですnumeric
...:
DECLARE @foo sql_variant;
SELECT @foo = 2.;
SELECT SQL_VARIANT_PROPERTY(@foo, 'BaseType');
GO
| (列名なし)|
| :--------------- |
| 数値|
ここに dbfiddle
…そして乗算演算子は、より高い優先度を持つ引数のデータ型を返します。
2016(SP1)では、すべての精度が保持されているようです:
SELECT @@version;
GO
| (列名なし)|
| :------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------- |
| Microsoft SQL Server 2016(SP1)(KB3182545)-13.0.4001.0(X64)<br> 2016年10月28日18:17:30 <br>著作権(c)Microsoft Corporation <br> Express Edition(64ビット)on Windows Server 2012 R2 Standard 6.3 <X64>(ビルド9600:)(ハイパーバイザー)<br> |
SELECT POWER(2.,64.);
GO
| (列名なし)|
| :------------------- |
| 18446744073709551616 |
ここに dbfiddle
…しかし、2014(SP2)では、以下ではありません。
SELECT @@version;
GO
| (列名なし)|
| :------------------------------------------------- -------------------------------------------------- -------------------------------------------------- -------------------------------------------------- ------------------------------------ |
| Microsoft SQL Server 2014(SP2)(KB3171021)-12.0.5000.0(X64)<br> 2016年6月17日19:14:09 <br>著作権(c)Microsoft Corporation <br> Express Edition(64ビット)on Windows NT 6.3 <X64>(ビルド9600:)(ハイパーバイザー)<br> |
SELECT POWER(2.,64.);
GO
| (列名なし)|
| :------------------- |
| 18446744073709552000 |
ここに dbfiddle