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

Sql server 我们可以使用存储过程在表中插入多行吗?,sql-server,stored-procedures,Sql Server,Stored Procedures,我有两张桌子: 订单(订单ID) T_项目(项目ID) 在T\u顺序表中,我将ItemID作为FK 是否可以使用存储过程在一个OrderID中存储多个ItemID 例如: OrderID 1具有ItemID 1,2,5 插入多个ItemID不会有问题。问题是,您希望如何将ItemIds获取到存储过程中。可以使用XML或用逗号分隔的列表,但这两个选项都不是真正的“推荐”,因为这会使事情复杂化。最好的解决方案是在应用程序中解决这个问题,而不是在数据库逻辑中解决。是的,有一种鲜为人知的方法可以将列表

我有两张桌子:

  • 订单(订单ID)
  • T_项目(项目ID)
  • T\u顺序
    表中,我将
    ItemID
    作为FK

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

    例如:

    • OrderID 1具有ItemID 1,2,5

      • 插入多个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#end绑定到存储过程。要绑定它,必须首先将数据存储在
        数据表中,这相对简单:

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