2014-12-24 44 views
0

說有一個表Sql Server的insert into表名與存儲的值與其他值PROC輸出

CREATE TABLE [Fruit](
[FruitId] [int] NOT NULL Identity(1,1), 
[Name] [nvarchar](255) NOT NULL, 
[Description] [nvarchar] (255) NOT NULL, 
[Param1] [int] NULL, 
[Param2] [int] NULL) 

和存儲過程,其中需要輸入,並有一個名爲@description的輸出參數。 我無法修改這個存儲過程。

EXECUTE usp_GetFruitDescription @Name, @Description OUTPUT 

現在我想插入到[水果]表中,如下所示。

INSERT INTO [Fruit] 

Values( 
    basket.Name 
    ,EXECUTE usp_GetFruitDescription basket.Name 
    ,basket.Param1 
    ,basket.Param2) 
FROM [FruitBasketEntry] basket 
WHERE basket.type is not null and basket.id > 6 

這是如何實現的?我見過INSERT INTO [table] EXECUTE usp_proc的例子,但是我沒有看到它插入其他值而不是存儲過程輸出。謝謝!

回答

2

最好的解決方案是將您的過程傳遞給一個表類型參數,並讓整個過程成套進行,但由於您已經提到您無法更改過程,因此下面是唯一的「性能低下」選項您。

DECLARE @Name  [nvarchar](255) 
DECLARE @Description [nvarchar](255) 

DECLARE cur CURSOR LOCAL FOR 
SELECT Name 
FROM [FruitBasketEntry] 
WHERE [type] IS NOT NULL AND id > 6 

OPEN cur 

FETCH NEXT FROM cur INTO @Name 

while (@@FETCH_STATUS = 0) 
BEGIN 

    --execute your procedure here 
    EXECUTE usp_GetFruitDescription @Name, @Description OUTPUT 

    -- Insert Statement here 
    INSERT INTO [Fruit] Values(@Name , @Description) 

    FETCH NEXT FROM cur INTO @Name 
END 

CLOSE cur 
DEALLOCATE cur 
+0

感謝您的回覆。我忘了提及實際上有更多的專欄和編輯問題。在那種情況下,我應該在循環中使用Name來查詢Param1,Param2? –

+1

好吧,您可以在選擇查詢中添加更多列,只需聲明更多變量並將下一個值提取到所有這些變量中,其他值應該相同。 –

1

你必須用循環邏輯來做到這一點。沒有其他方法可以將輸出參數直接放入表中。如果存儲過程返回一個表,則可以將這些行插入另一個表中。或者,如果您使用存儲的函數而不是過程,則可以將其直接放入查詢中。

可能最好的方法是使用遊標。我幾乎從不推薦遊標,但這是一個似乎很需要的情況。