TSQL 将 2 个值数组传递给存储过程

TSQL passing 2 values array to stored procedure

我正在使用 SQL Server 2012 和 C#。

假设有一个类似于购物车的东西,现在需要创建一个包含以下项目的订单:

productA - 4 (qty)  
productB - 1 (qty) 
productC - 9 (qty)

在我的 C# 代码中,我有一个如下所示的列表:

id : "productA" , qty : "4"  
id : "productB" , qty : "1"  
id : "productV" , qty : "9"

问题:

  1. 如何将包含 2 个值的列表传递给存储过程?

  2. 如何让存储过程 运行 3 while 循环每个 运行ning 4 次,然后一次然后 9 次以物理创建一个记录 x 请求?

注意:在我的例子中,table 中没有 QTY 列,我需要在订单上专门创建一个记录 x 项目。

要将 table 传递到存储过程中,请使用 table-valued parameter

首先创建一个类型:

CREATE TYPE [dbo].[ProductsTableType] AS TABLE(
    [ID] [varchar](50) NOT NULL,
    [qty] [int] NOT NULL
)

然后在存储过程中使用这个类型。 @ParamProducts 是一个 table,可用于所有可以使用 table 的查询。

CREATE PROCEDURE [dbo].[AddProducts]
    @ParamProducts ProductsTableType READONLY
AS
BEGIN
    ...
END

要实际插入所需的行数,我会使用 table of numbers , http://web.archive.org/web/20150411042510/http://sqlserver2000.databases.aspfaq.com/why-should-i-consider-using-an-auxiliary-numbers-table.html

在我的数据库中,我有一个名为 Numbers 的 table,其列 Number 包含从 1 到 100,000 的数字。一旦你有了这样的 table 就很容易得到你需要的集合。

DECLARE @T TABLE (ID varchar(50), qty int);

INSERT INTO @T (ID, qty) VALUES ('productA', 4);
INSERT INTO @T (ID, qty) VALUES ('productB', 1);
INSERT INTO @T (ID, qty) VALUES ('productV', 9);

SELECT * 
FROM
    @T AS Products
    INNER JOIN dbo.Numbers ON Products.qty >= dbo.Numbers.Number
;

结果集

ID          qty Number
productA    4   1
productA    4   2
productA    4   3
productA    4   4
productB    1   1
productV    9   1
productV    9   2
productV    9   3
productV    9   4
productV    9   5
productV    9   6
productV    9   7
productV    9   8
productV    9   9

这是一个例子。在你的情况下,你会在 INSERT INTO YourFinalTable.

中有这个 SELECT
  1. 您可以通过 SQL 中的 Table 值参数来完成此操作。

Sql Authority

MSDN

  1. 您可以通过将 TVP 作为 @table 格式

    传递来完成此操作
    declare @table table(product varchar(10), qty int)
    
    insert into @table
       select 'product1', 4 union
       select 'product2', 2
    
    ;WITH cte AS (
       SELECT product, qty FROM @table
       UNION ALL
       SELECT product, qty-1 FROM cte WHERE qty > 1
    )
    SELECT t.product, t.qty 
    FROM cte c
    JOIN @table t ON c.product = t.product
    ORDER BY 1
    

CTE 参考:Creating duplicate records for a given table row