例子:
-- inputs
declare @x decimal(28,10) = 10001.0
declare @y decimal(18,6) = 7.0
-- later on, inside a udf
select POWER(@x, @y)
結果:
訊息 8115,級別 16,狀態 6,第 13
行將浮點數轉換為數字資料型別的算術溢位錯誤。
我明白為什么會發生溢位。我的問題是,是否可以在執行 POWER 之前檢測是否會發生溢位?請注意,代碼在 UDF 內運行,因此不能使用 TRY...CATCH。如果我可以提前檢測到,我可以采取回避措施(例如回傳NULL作為結果,這適合我的要求)。
uj5u.com熱心網友回復:
您可以使用 Try-Catch 或者您可以使用公式來預測輸出數字并回傳 NULL。從這里預測位數的公式
預測冪函式的位數
Declare @Num DECIMAL(28,10) = 10001
,@Exponent DECIMAL(28,10) = 7
,@NumOfDigits INT
/*Predict number of digits from power function*/
SELECT @NumOfDigits = FLOOR(1 @exponent* CAST(LOG(@Num,10) AS DECIMAL(38,10)))
SELECT
CASE WHEN @NumOfDigits <= 38 /*Max decimal precision, return type from POWER function according to https://docs.microsoft.com/en-us/sql/t-sql/functions/power-transact-sql?view=sql-server-ver15*/
- 10 /*Scale of @Num. Need to leave enough digits to record decimal places*/
THEN POWER(@Num,@Exponent) /*If less than or equal to precision, return value*/
ELSE NULL /*If outside precision, just returns NULL. Could update to return something else*/
END
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/425854.html
上一篇:檢查NULL并連接字串的函式
