首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 預存程序 IF ELSE 條件插入實戰:解決外鍵允許 NULL 但程式無法傳 NULL 的難題

     編輯:關於SqlServer

場景: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)。
  • 回傳新 ID:SCOPE_IDENTITY() 獲取當前範圍內最新自增值,供呼叫端後續業務使用。
  • 可擴展性:若未來多欄位有同類需求,可擴展為動態 SQL 或 COALESCE/NULLIF 寫法,但 IF ELSE 結構最清晰易維護。

此模式廣泛適用於「程式端無法表達 NULL、資料庫端允許 NULL」的阻抗失配場景,是預存程序封裝業務規則的經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved