我有兩個表:我們可以使用存儲過程在表中插入多行嗎?
- T_Order(訂單ID)
- T_Item(條目標識號)
在T_Order
表我有ItemID
作爲FK。
是否可以使用存儲過程將多個ItemID存儲在一個OrderID中?
例如:
- 訂單ID 1具有的ItemID 1,2,5-
我有兩個表:我們可以使用存儲過程在表中插入多行嗎?
在T_Order
表我有ItemID
作爲FK。
是否可以使用存儲過程將多個ItemID存儲在一個OrderID中?
例如:
插入多的ItemID就沒有問題。問題是,你想如何獲得ItemIds到你的存儲過程。有可能使用XML或用逗號分隔的列表,但這兩個選項都不是真正的「推薦」,因爲它使事情變得複雜。最好的解決方案是在應用程序中解決這個問題,而不是數據庫邏輯。
是的,有一種鮮爲人知的方式將列表上載爲單個存儲過程參數,並使其在沒有多次調用的情況下工作。需要一些設置。
首先,你必須定義,它可以包含你的列表中的SQL類型:
CREATE TYPE dbo.MyList
AS TABLE
(
ID VarChar(50)
);
然後,寫一個接受這種類型作爲輸入參數的存儲過程:
CREATE PROCEDURE dbo.InsertOrderItems
@OrderID int, @ItemList AS dbo.MyList READONLY
AS
BEGIN
SET NOCOUNT ON;
INSERT INTO [dbo][Orders]
SELECT @OrderID
INSERT INTO [dbo].[OrderItems]
SELECT @OrderID, ID FROM @ItemList
END
我們將你的數據綁定到C#端的存儲過程。要綁定它,你必須存儲在DataTable
第一的數據,這是比較容易的:
var table = new DataTable();
table.Columns.Add("ID", typeof(string));
foreach (var itemID item in order.Items)
{
table.Rows.Add(itemID);
}
然後提交表格的存儲過程,像這樣:
var cmd = new SqlCommand()
{
CommandType = CommandType.StoredProcedure,
CommandText = "InsertOrderItems",
Connection = myConnection
};
cmd.Parameters.Add(new SqlParameter("@OrderID", order.ID);
cmd.Parameters.Add(new SqlParameter("@ItemList", SqlDbType.Structured)
{
TypeName = "dbo.MyList",
Value = table
});
cmd.ExecuteNonQuery();