存储过程中一个参数中的多个值

时间:2018-04-02 05:26:09

标签: sql-server

我的存储过程需要在[订单明细]表中插入多个产品。

一个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)

订单详情的样本图片

enter image description here

2 个答案:

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

存储过程以表值参数的形式接受表输入。看看这里的文档

https://docs.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine

这包括一个关于如何调用这样的存储过程的示例。

您可以直接在存储过程体中使用类似于表变量(样本中的@myOrders)的TVP。

如果您还希望从ADO.NET调用该存储过程,则下面的文章有一个很好的描述。

https://www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters