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"
问题:
如何将包含 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
- 您可以通过 SQL 中的 Table 值参数来完成此操作。
您可以通过将 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
我正在使用 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 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
- 您可以通过 SQL 中的 Table 值参数来完成此操作。
您可以通过将 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