場景:A 表主鍵為 Identity 且為 B 表外鍵(允許 NULL)。程式中 Int 型別無法傳遞 NULL(預設 0),導致插入 B 表時誤關聯到 A 表 ID=0(不存在)或違反外鍵。解決方案:預存程序內部 IF ELSE 判斷,@SourceID = 0 視為 NULL 不寫入該欄位,否則正常寫入。
CREATE PROCEDURE [dbo].[P_Form_Control_Info_Add]
@TypeName varchar(20),
@Description varchar(50),
@CtlColSpan int,
@Sort int,
@SourceID int, -- 0 代表 NULL
@FieldID int,
@TableID int
AS
BEGIN
IF @SourceID = 0
BEGIN
INSERT INTO T_Form_Control_Info
(TypeName, Description, CtlColSpan, Sort, FieldID, TableID)
VALUES
(@TypeName, @Description, @CtlColSpan, @Sort, @FieldID, @TableID)
END
ELSE
BEGIN
INSERT INTO T_Form_Control_Info
(TypeName, Description, CtlColSpan, Sort, SourceID, FieldID, TableID)
VALUES
(@TypeName, @Description, @CtlColSpan, @Sort, @SourceID, @FieldID, @TableID)
END
RETURN SCOPE_IDENTITY() -- 回傳新增行自增 ID
END
@SourceID = 0 代表「無關聯/NULL」,避免程式層傳 NULL 的語言限制。INSERT 明確列出欄位,NULL 情況下完全省略 SourceID,資料庫自動填入預設值(NULL)。SCOPE_IDENTITY() 獲取當前範圍內最新自增值,供呼叫端後續業務使用。COALESCE/NULLIF 寫法,但 IF ELSE 結構最清晰易維護。此模式廣泛適用於「程式端無法表達 NULL、資料庫端允許 NULL」的阻抗失配場景,是預存程序封裝業務規則的經典範例。