2014-10-27 169 views
0

我有两个需要插入到数据库中的ID列表。我想在这里做的是,将这两个列表传递给一个存储过程,并试图添加一个while循环。我试图用用户定义的类型来定义该数组,但不知道如何把它传递到插入命令将列表传递给存储过程

CREATE TYPE [dbo].[Array] AS TABLE(
[Item] [NVARCHAR](MAX) NULL 
); 

这是SQL/PL:

ALTER PROCEDURE [dbo].[sp_create_order] 
(@productIds AS Array READONLY, @priceIds AS Array READONLY) 
AS 
BEGIN 
    DECLARE @i int 
    DECLARE @n int  


set @n = count(@productIds) 
set @i = 1; 

while (@i <= @n) 
BEGIN  
INSERT INTO order_detail(product_id,price_id) 
    VALUES(@productIds[i],@priceIds[i]); 
set @i = @i + 1; 
END 
END 
RETURN 0 
+0

为什么你会在这里使用循环?当你定义一个表数据类型是为了避免使用循环。你将它们作为一个表引用,因为它们是一张表。 – 2014-10-27 19:53:47

+0

对我来说,你应该用两列创建你的表类型,而不是传递两个表参数。您需要一种方法将它们合并到一行中以便插入语句。 – 2014-10-27 19:55:15

回答

2

考虑更改类型包括两对。

CREATE TYPE [dbo].[ProductPrices] AS TABLE(
[ProductId] [NVARCHAR](MAX) NULL, 
[PriceId] [NVARCHAR](MAX) NULL 
); 

然后改变你的程序为以下内容:

create procedure [dbo].[sp_create_order] @productPrices dbo.ProductPrices READONLY 
as 
begin 
    insert into order_detail 
    select p.ProductId, 
     p.PriceId 
    from @productPrices p 
end 

然后,你可以打电话给你的程序本身。

declare @productPrices dbo.ProductPrices; 

insert into @productPrices 
values('1', '7'), 
('2', '12'), 
('3', '8'); 

exec dbo.sp_create_order @productPrices; 
1

看起来你正在学习表值参数,你应该创建一个带有两列的表值参数,这样你就可以直接插入

这里有一种解决当前问题的方法,我们可以使用ROW_NUMBER来生成一个序列号,并从两者中获得一个行值表

create PROCEDURE [dbo].[sp_create_order] 
(@productIds AS Array READONLY, @priceIds AS Array READONLY) 
AS 
BEGIN 

INSERT INTO order_detail(product_id,price_id) 
select T1.item, T2.item 
FROM 
(select item , ROW_NUMBER() over (order by (select null)) as seq from @productIds) T1 
join 
(select item , ROW_NUMBER() over (order by (select null)) as seq from @priceIds) T2 
on T1.seq = T2.seq 


END 
相关问题