我们可以使用存储过程将多行插入表中吗?

时间:2017-10-07 06:31:21

标签: sql-server stored-procedures

我有两张桌子:

  1. T_Order(OrderID)
  2. T_Item(ItemID)
  3. T_Order表中,我将ItemID作为FK。

    是否可以使用存储过程在一个OrderID中存储多个ItemID?

    例如:

    • OrderID 1具有ItemID 1,2,5

2 个答案:

答案 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();