我正在更新我的IDENTITY溢出检查脚本以考虑DECIMAL和NUMERIC IDENTITYcolumns。
作为检查的一部分,我计算每一IDENTITY列的数据类型范围的大小;我用它来计算该范围的百分比已用完。因为DECIMAL和NUMERIC 该范围的大小2 * 10^p - 2p是精度在哪里。
我用DECIMAL和NUMERIC IDENTITY列创建了一堆测试表,并尝试按如下方式计算它们的范围:
SELECT POWER(10.0, precision)
FROM sys.columns
WHERE
is_identity = 1
AND type_is_decimal_or_numeric
;
Run Code Online (Sandbox Code Playgroud)
这引发了以下错误:
Msg 8115, Level 16, State 6, Line 1
Arithmetic overflow error converting float to data type numeric.
Run Code Online (Sandbox Code Playgroud)
我将它缩小到IDENTITY类型的列DECIMAL(38, 0)(即具有最大精度),然后我POWER()直接尝试对该值进行计算。
以下所有查询
SELECT POWER(10.0, 38.0);
SELECT CONVERT(FLOAT, (POWER(10.0, 38.0)));
SELECT CAST(POWER(10.0, 38.0) …Run Code Online (Sandbox Code Playgroud)