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

SQL Server 插入資料後取得自動遞增識別值的最佳實踐

     編輯:關於SqlServer

識別值擷取函數比較

在 T-SQL 中有三個函數可取得最新插入的識別欄值,各有適用場景:

函數範圍特性建議用途
SCOPE_IDENTITY()目前執行範圍不受觸發器影響,回傳當前範圍最後識別值最推薦,大多數情況適用
@@IDENTITY目前工作階段包含任何表格產生的識別值,受觸發器影響僅在確定無觸發器時使用
IDENT_CURRENT('table')所有工作階段回傳特定表格最後識別值,跨工作階段需指定表格名稱,適合特定查詢

輸出參數存儲過程範例

CREATE PROCEDURE dbo.CustomerInsert
    @Name VARCHAR(15),
    @Age INT,
    @Sex BIT,
    @id INT OUTPUT
AS
BEGIN
    INSERT INTO Customer (Name, Age, Sex) VALUES (@Name, @Age, @Sex);
    SET @id = SCOPE_IDENTITY(); -- 關鍵:使用 SCOPE_IDENTITY()
END

C# 資料存取層實作

使用 SqlDataAdapter 搭配 InsertCommand 處理輸出參數:

public int InsertCustomer(Customer cus, DataTable dt)
{
    using (SqlConnection con = new SqlConnection(connString))
    {
        SqlDataAdapter adp = new SqlDataAdapter();
        adp.InsertCommand = new SqlCommand("dbo.CustomerInsert", con);
        adp.InsertCommand.CommandType = CommandType.StoredProcedure;

        // 輸入參數
        adp.InsertCommand.Parameters.Add("@Name", SqlDbType.VarChar, 20, "Name");
        adp.InsertCommand.Parameters.Add("@Age", SqlDbType.Int, 4, "Age");
        adp.InsertCommand.Parameters.Add("@Sex", SqlDbType.Bit, 1, "Sex");

        // 輸出參數設定
        SqlParameter parId = adp.InsertCommand.Parameters.Add("@id", SqlDbType.Int, 0, "id");
        parId.Direction = ParameterDirection.Output;

        // 執行插入並取得識別值
        DataRow row = dt.NewRow();
        row["Name"] = cus.Name; row["Age"] = cus.Age; row["Sex"] = cus.Sex;
        dt.Rows.Add(row);
        adp.Update(dt); // 觸發 InsertCommand

        return Convert.ToInt32(row["id"]); // 取得回寫的識別值
    }
}

關鍵要點

  • 永遠優先使用 SCOPE_IDENTITY() 避免觸發器干擾
  • 輸出參數必須設定 Direction = ParameterDirection.Output
  • SqlDataAdapter.Update() 會自動將輸出參數值回寫至 DataRow
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved