2011-12-09 15 views
0

人物のレコードを返す大きなストアドプロシージャがあります。非常に固有の値を返すために必要なフィールドが4つあります。この特定のアクションを実行する別のストアドプロシージャがあります。次のようにSQLストアドプロシージャの値を別のストアドプロシージャに挿入します。

小さなストアドプロシージャは次のとおりです。

SELECT TOP 1 
    wea.field, 
    wea.degree, 
    wea.degreeyear, 
    wpp.ProgramCategory 
FROM dbo.webeventaffiliation wea 
LEFT JOIN dbo.WebProgramParticipants wpp 
    ON 
     wea.userid = wpp.UserID AND 
     wea.eventid = wpp.eventid 
INNER JOIN dbo.WebProgramCategoryDescriptions wpcd 
    ON 
     wpcd.ProgramCategory = wpp.ProgramCategory 
WHERE wea.UserID = @UserID 
    ORDER BY wea.datelastmodified DESC 

LARGEストアドプロシージャのサンプルリターンDATA:

Name: XXXXX 
Address: XXXXX 
Field: [small stored procedure value] 
Degree: [small stored procedure value] 
DegreeYear: [small stored procedure value] 
ProgramCategory: [small stored procedure value] 

私の質問は、私はこのストアドプロシージャから自分の中に4つのデータ・アイテムを入手できます方法です大規模なストアドプロシージャから返されるデータセット内の各列?あなたは四つの値を持つ行を1つだけ取得しているので

+0

いいえ、2番目のストアドプロシージャは、大きなストアドプロシージャではない4つの列のデータを持ちます。私は大規模なストアドプロシージャからEXEC呼び出しを行うことができると思っていましたが、それを行う方法がわかりません。 – mattgcon

答えて

0

あなたがOUTPUTパラメータを使用できます。

EXECUTE SomeSmallerProcedure 
    @field OUTPUT, @degree OUTPUT, @degreeyear OUTPUT, @ProgramCategory OUTPUT; 

に変更します上記のあなたの手順:上記

ALTER PROCEDURE SomeSmallerProcedure 
    @field varchar(255) OUTPUT, 
    @degree varchar(255) OUTPUT, 
    @degreeyear varchar(255) OUTPUT, 
    @ProgramCategory varchar(255) OUTPUT 
AS BEGIN SET NOCOUNT ON; 
    SELECT TOP 1 
    @field = wea.field, 
    @degree = wea.degree, 
    @degreeyear = wea.degreeyear, 
    @ProgramCategory = wpp.ProgramCategory 
    -- ... rest as before 

プロシージャの署名が希望OUTPUTの明示的にそれらのパラメータを含める必要があります。

+0

大丈夫ですが、どうすれば大規模な手順でそれを設定できますか?私はEXEC somesmallerprocedure(x、x、x、x)ASフィールドを大規模なプロシージャ内に置くことができると思ったが、それはうまく動作しない。 – mattgcon

+0

大きな手続きの中では、最初のコードスニペットと同じように、一度小さいものを呼び出すことになります。 – Yuck

+0

あなたが提案した変更を行った後で、私はユーザーIDを渡していますが、あなたの提案を試みましたが、指定された引数が多すぎますと教えています – mattgcon

2

ストアドプロシージャの代わりにテーブル値関数を使用すると便利です。あなただけのテーブル、すなわち同じようTVFを使用することができます:

SELECT 
    COLUMNS_NAMES 
FROM 
    TVF(PARAMS) 
1

あなたの小さなストアドプロシージャとして、あなただけのテーブル値関数としてそれを書くことができ、何も書き込みません。

次に、APPLYを使用してデータセット全体に機能を適用できます。

(INLINE(ないマルチステートメントを)書かれている表値関数は、マクロのような、非常に効率的に実行するようにexplandedている機能として、あなたの説明だけで、すでに単一のSELECT文になりますため。これは完璧です。)


機能:

CREATE FUNCTION dbo.your_function(@user_id AS INT) 
RETURNS TABLE 
AS 
RETURN 
    <your query> 


あなたの大きなSP内のクエリで使用される機能:私は、クエリをカプセル化し、場合にのみ、ストアドプロシージャでそれらをラップする関数を使用し、一般的に

SELECT 
    ..., 
    user_detail.field, 
    user_detail.degree, 
    user_detail.degreeyear, 
    user_detail.programcategory 
FROM 
    ... 
CROSS APPLY 
    dbo.your_function(some_table.user_id) AS user_detail 


...
1)Iデータを書き込む必要があります。 (関数はINSERT、UPDATE、DELETEできません)2)私はクライアントアプリケーションへのインターフェイスのようなAPIを作成したいと思います。

関連する問題