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

时间:2015-03-04 02:28:06

标签: tsql sql-server-2012

我使用的是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,循环每个运行4次,然后一次9次,以便物理创建一个记录x请求?

  3. 注意:在我的情况下,表格中没有QTY列,我需要在订单上专门创建一个记录x项。

2 个答案:

答案 0 :(得分:2)

  1. 您可以通过SQL中的表值参数完成此操作。
  2. 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
      
    2. CTE参考:Creating duplicate records for a given table row

答案 1 :(得分:1)

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

首先创建一个类型:

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

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

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

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

在我的数据库中,我有一个名为Numbers的表格,其中Number列包含1到100,000之间的数字。一旦你有这样的表,获得你需要的集合是微不足道的。

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

这是一个例子。在您的情况下,SELECT内有INSERT INTO YourFinalTable