我有两张桌子:
在T_Order
表中,我将ItemID
作为FK。
是否可以使用存储过程在一个OrderID中存储多个ItemID?
例如:
答案 0 :(得分:0)
插入多个ItemID就没问题了。问题是,您希望如何将ItemIds存储到存储过程中。可以使用XML或用逗号分隔的列表,但这两个选项都不是真的"推荐"因为它使事情复杂化。最好的解决方案是在应用程序而不是数据库逻辑中解决这个问题。
答案 1 :(得分:0)
是的,有一种鲜为人知的方法可以将列表作为单个存储过程参数上传,并使其无需多次调用即可运行。需要进行一些设置。
首先,您必须定义一个可以包含列表的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#end的存储过程。要绑定它,您必须先将数据存储在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();