在 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
使用 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.OutputSqlDataAdapter.Update() 會自動將輸出參數值回寫至 DataRow