T-Sql

T-SQL 中的泛型類型函式

  • May 16, 2019

考慮以下函式

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 個字節。數字數據類型一定會損失一些精度。數據庫通常希望您提前定義數據類型。如果您將該除法的結果保存到列或變數中,那麼您需要這樣做。

我想您可以將所有內容都轉換為字元串,滾動您自己的除法方法,並將輸出作為字元串提供。但是你會怎麼處理結果呢?

引用自:https://dba.stackexchange.com/questions/238122