我有两个表:我们可以使用存储过程在表中插入多行吗?
- 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();