我使用的是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"
问题:
如何将2个值的列表传递给存储过程?
我如何让存储过程运行3,循环每个运行4次,然后一次9次,以便物理创建一个记录x请求?
注意:在我的情况下,表格中没有QTY
列,我需要在订单上专门创建一个记录x项。
答案 0 :(得分:2)
您可以将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
答案 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 numbers,http://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
。