2012-02-21 10 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_proc1で宣言された変数にup_proc2の@idを格納することです。これは、出力パラメータを使用せずに可能ですか?

これは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

なぜあなたは、出力パラメータを避けたいのですか?これはまさに彼らのためのものです。 –

+0

私はSQLをあまり経験していません。 up_proc2は既存のストアドプロシージャです。出力パラメータを追加しても既存の機能が損なわれないかどうか分かりません。 up_proc2はC#コードからも呼び出されます。 C#からそのストアドプロシージャを呼び出すときに、その出力パラメータをパラメータのリストに追加する必要がありますか?もしそうでなければ、実際に出力パラメータを使用することができます。 – TweeZz

+0

はい、null可能な出力パラメータを追加することはできますが、C#では通知されません(単一のスカラー値のみを取得する場合はC#コードを変更して使用する必要があります)。私の答えを見てください。 –

答えて

7

:その後、

DECLARE @tmpTable TABLE (ID UNIQUEIDENTIFIER) 

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

、そこから行くと、後でそのテーブル変数を使用します。

+0

SQL Serverのバージョンによって、テーブル変数が2000に存在せず、2005年にテーブル変数に/ execを挿入できませんでした(Msg 197)。 –

+0

それを試してみました..完全に、thx .. 私はまだSQL Serverのバージョンは、お客様が使用しているか分からない。私は2008年です。 – TweeZz

+1

[this](http://social.msdn.microsoft.com/Forums/en-US/sqltools/thread/e70c61c9-5d5f-4525-8be9-3a3df3e2c0ed/)によると、それは可能であるようです2008年と2005年ではなく、2000年ではない? – TweeZz

4

これは、C#コードが最終的な結果セットを取得する方法に影響を与えずに、proc2の出力パラメータとして使用できます。それがNULL可能であるため、

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

+0

あなたが明白な質問に答えなかったのは、あなたがそれが問題を引き起こすと思ったので最も賢明な方法を排除したからです。問題を起こすことなく、より合理的で効率的なやり方をすることができることを示しました。お金を使わずに食料品を買う方法を尋ねられたなら、私は盗品を示唆することができました。まだ質問への答えはありませんか? –

+0

違反はありませんが、私はいくつかのお金を稼ぐための選択肢を除外しました:)質問を(出力なしで)読んでから答えを出すのは混乱するかもしれません。私はあなたに私に賢明な方法を示していただきありがとうございます:) – TweeZz

関連する問題