2012-02-21 59 views
2

我有2個存儲過程:up_proc1和up_proc2。存儲存儲過程的結果而不使用輸出參數

這是(的簡化版本)up_proc2:

CREATE PROCEDURE dbo.up_proc2 
    @id_campaign uniqueidentifier, @id_subcampaign uniqueidentifier, 
    @id_lead uniqueidentifier, @offer NVARCHAR(1000) = NULL 
AS 
    SET NOCOUNT ON 

    DECLARE @id UNIQUEIDENTIFIER 

    SELECT @id = id FROM prospects WHERE id_lead = @id_lead 
     AND id_campaign = @id_campaign AND id_subcampaign = @id_subcampaign 
    IF @id IS NULL 
    BEGIN 
      SET @id = newid() 
      INSERT INTO prospects (id, id_campaign, id_subcampaign, id_lead, offer) 
      values (@id, @id_campaign, @id_subcampaign, @id_lead, @offer) 
    END 
    ELSE 
    BEGIN 
      UPDATE prospects set offer = @offer WHERE [email protected] 
    END 

    SELECT @id AS ID 
GO 

從up_proc1我打電話up_proc2。我想實現的是將up_proc2的@id存儲在up_proc1中聲明的變量中。這可能不使用輸出參數?

這是up_proc1的樣子:

CREATE PROCEDURE dbo.up_proc1 
AS 
    SET NOCOUNT ON 

    DECLARE @fromProc2 UNIQUEIDENTIFIER 

    -- NOT WORKING 
    -- select @fromProc2 = exec up_insertProspects [snip] 

    -- ALSO NOT WORKING 
    -- exec @fromProc2 = up_insertProspects [snip] 
+0

爲什麼你要避免輸出參數?這正是他們想要的。 – 2012-02-21 13:15:29

+0

我對sql不太熟悉。 up_proc2是一個現有的存儲過程。我不確定添加輸出參數是否不會破壞任何現有功能? up_proc2也從C#代碼調用。在從C#調用存儲過程時,是否必須將該輸出參數添加到參數列表中?如果沒有,那麼我可能確實可以使用輸出參數。 – TweeZz 2012-02-21 13:27:45

+0

是的,您可以添加一個可爲空的輸出參數,並且C#不會注意(儘管如果您只檢索單個標量值,您應該更改C#代碼以使用它)。請看我的答案。 – 2012-02-21 14:06:46

回答

7

你可以做的是輸出存入一個表變量:

DECLARE @tmpTable TABLE (ID UNIQUEIDENTIFIER) 

INSERT INTO @tmpTable 
    EXEC dbo.up_proc2 .......... 

,然後從那裏走,後來使用該表變量。

+0

取決於SQL Server的版本 - 表變量在2000年不存在,並且您無法在2005年(Msg 197)中將/ exec插入到表變量中。 – 2012-02-21 13:19:29

+0

試過了..完美地工作,thx .. 我不確定客戶正在使用什麼sql服務器版本。我有2008. – TweeZz 2012-02-21 14:13:21

+1

根據[this](http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/e70c61c9-5d5f-4525-8be9-3a3df3e2c0ed/),它似乎是可能的在2008年和2005年,但不是在2000年? – TweeZz 2012-02-21 14:28:25

4

您當然可以將它作爲proc2中的輸出參數使用,而不會影響C#代碼如何檢索最終結果集。

ALTER PROCEDURE dbo.up_proc2 
    @id_campaign uniqueidentifier, 
    @id_subcampaign uniqueidentifier, 
    @id_lead uniqueidentifier, 
    @offer NVARCHAR(1000) = NULL, 
    @fromProc2 UNIQUEIDENTIFER = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 
    ... 

C#可以忽略新的參數,因爲它可以爲空(但由於單個輸出參數比數據讀取更有效,你可以考慮更新你的C#代碼後趁輸出參數)。

現在PROC1:

ALTER PROCEDURE dbo.up_proc1 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @fromProc2 UNIQUEIDENTIFIER; 

    EXEC dbo.up_proc2 
     --... other parameters ..., 
     @fromProc2 = @fromProc2 OUTPUT; 

    -- now you can use @fromProc2 
END 
GO 
+0

+1不是真正的問題答案,但很高興知道! – TweeZz 2012-02-21 14:21:52

+0

好的,我沒有回答你明確的問題,因爲你排除了最明智的做法,因爲你認爲這會導致問題。我告訴你,你可以做到更明智,更有效的方式而不會造成問題。如果您問過如何購買食品雜貨而不使用金錢,我可能會建議偷竊,或者我可能建議賺取一些錢。仍然不是問題的答案? – 2012-02-21 15:02:20

+0

沒有冒犯,但在問題中,我排除了賺取一些錢的選項:)讀取問題(沒有輸出)然後回答(輸出)可能會令人困惑。我感謝你給我看了明智的方式:) – TweeZz 2012-02-21 16:07:07