UPDATE 陳述式中**無法直接呼叫預存程序**,且常需依據多欄位/多表關聯進行複雜計算。**標量使用者定義函數 (Scalar UDF)** 成為封裝此類邏輯的最佳選擇:可在 SELECT/WHERE/SET 子句中像內建函數一樣呼叫,程式碼可重用、可維護、可測試。
業務邏輯:根據任務階段 (`TaskPhase`) 所屬任務 (`Task`) 的工時 (`TaskTime`) 與工作負擔百分比 (`WorkPercent`),計算關鍵度貢獻值 (`Cvalue_M`)。
CREATE FUNCTION [dbo].[FUN_GETTIME] (@TaskPhaseID INT)
RETURNS FLOAT
AS
BEGIN
DECLARE @TaskID INT, @Hour FLOAT, @Percent FLOAT, @Result FLOAT;
IF @TaskPhaseID IS NULL RETURN 0.0;
-- 取得任務 ID 與工作負擔%
SELECT @TaskID = TaskID, @Percent = ISNULL(WorkPercent, 0) / 100.0
FROM TableTaskPhase
WHERE ID = @TaskPhaseID;
-- 取得任務工時
SELECT @Hour = ISNULL(TaskTime, 0)
FROM TableTask
WHERE ID = @TaskID;
SET @Result = @Hour * @Percent;
RETURN @Result;
END;
GO
CREATE PROCEDURE [dbo].[PROC_CALCCA] @ROID INT
AS
BEGIN
DECLARE @CA FLOAT;
UPDATE TableFMECA
SET Cvalue_M = ISNULL(Moderate, 0) * ISNULL(FMERate, 0) * ISNULL(B.BasFailureRate, 0) * dbo.FUN_GETTIME(C.ID)
FROM TableFMECA
JOIN TableRelation B ON B.ID = @ROID
JOIN TableTaskPhase C ON C.ID = TableFMECA.TaskPhaseID
WHERE TableFMECA.ROID = @ROID;
SELECT @CA = SUM(ISNULL(Cvalue_M, 0))
FROM TableFMECA
WHERE ROID = @ROID;
UPDATE TableRelation
SET Criticality = @CA
WHERE ID = @ROID;
END;
GO