我的存储过程需要在[订单明细]表中插入多个产品。
一个OrderID =许多产品。
我看到了一个代码,您可以在其中创建一个临时表,如列表来存储多个值。但是,当值未预定义或是用户输入时,我不知道如何使用它。
--I want to input multiple ProductID in this temporary table
DECLARE @myOrders table (ID int)
INSERT INTO @myOrders ("")
--Then get data from the Products table and input the data in Order Details
INSERT INTO [Order Details] (ProductID)
SELECT ProductID From Products
WHERE ProductID IN (SELECT ID FROM @myOrders)
订单详情的样本图片
答案 0 :(得分:1)
首先,您需要定义类似
的类型CREATE TYPE ProductList AS TABLE
(
ProductId INT
)
GO
然后按照以下
创建您的程序ALTER PROCEDURE USP_TEST_PROC (@OrderId INT,@Produt_Id_List ProductList READONLY)
AS
BEGIN
DECLARE @OrderDetails TABLE(OrderId INT, ProductID INT,UnitPrice DECIMAL(18,2),Quantity INT, Discount DECIMAL(18,2))
DECLARE @Products TABLE(ProductID INT,UnitPrice DECIMAL(18,2),Quantity INT, Discount DECIMAL(18,2))
INSERT INTO @OrderDetails (OrderId, ProductID,UnitPrice,Quantity, Discount)
SELECT @OrderId, ProductID,UnitPrice,Quantity,Discount FROM @Products WHERE ProductID IN (SELECT ProductId FROM @Produt_Id_List)
SELECT * FROM @OrderDetails
END
然后准备表变量以放置如下的值
DECLARE @PList ProductList;
INSERT @PList VALUES (1),(2),(3)
最后调用程序
EXEC USP_TEST_PROC 100,@PList
由于
答案 1 :(得分:0)
存储过程以表值参数的形式接受表输入。看看这里的文档
这包括一个关于如何调用这样的存储过程的示例。
您可以直接在存储过程体中使用类似于表变量(样本中的@myOrders)的TVP。
如果您还希望从ADO.NET调用该存储过程,则下面的文章有一个很好的描述。
https://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters