2014-10-27 171 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 
相關問題