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或用逗号分隔的列表,但这两个选项都不是真正的“推荐”,因为这会使事情复杂化。最好的解决方案是在应用程序中解决这个问题,而不是在数据库逻辑中解决。是的,有一种鲜为人知的方法可以将列表
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();