T-Sql
T-SQL 中的泛型類型函式
考慮以下函式
CREATE FUNCTION dbo.SafeDivide ( @a numeric, @b numeric ) RETURNS numeric AS BEGIN RETURN CASE WHEN @b = 0 THEN 0 ELSE @a / @b END; END;
這裡
numeric
使用了類型,但此程式碼對於任何精度的數字類型都很有用。有沒有辦法定義和使用這樣的功能?
我試過
sql_variant
打字,但它抱怨Operand data type sql_variant is invalid for divide operator
錯誤說明了要做什麼,即 sql_variant 類型不接受操作除法函式。
我建議根據您的使用情況將 CONVERT/CAST 用於特定的數據類型。下面我將使用浮點數:
DROP FUNCTION IF EXISTS dbo.SafeDivide GO CREATE FUNCTION dbo.SafeDivide ( @a sql_variant, @b sql_variant ) RETURNS sql_variant AS BEGIN RETURN CASE WHEN @b = 0 THEN 0.00 ELSE Convert(float, @a) / Convert(float, @b) END; END GO /* select dbo.SafeDivide(4,4.4622434) */
我不認為這是實用的。考慮以下範例:
DECLARE @big_value_for_u NUMERIC(38,0) = 99999999999999999999999999999999999999, @small_value NUMERIC(38, 38) = 0.00000000000000000000000000000000000001;
您希望以下表達式具有什麼數據類型?
SELECT @big_value_for_u / @small_value
NUMERIC
最大精度為 38,FLOAT
只有 8 個字節。數字數據類型一定會損失一些精度。數據庫通常希望您提前定義數據類型。如果您將該除法的結果保存到列或變數中,那麼您需要這樣做。我想您可以將所有內容都轉換為字元串,滾動您自己的除法方法,並將輸出作為字元串提供。但是你會怎麼處理結果呢?