2011-01-19 3 views
0

いくつかの変数とネストされたifステートメントでストアドプロシージャを作成しました。 私のプログラムからストアドプロシージャを呼び出し、返された値の返されたデータセットをチェックすると、その中にレコードがあるはずの私のデータセットは空です。いくつかのテストの後、if文(@PoolID = 0)がテストされ、@PoolIDが0の場合、if文には通らないことに気がつきました...私のコードで変数poolidを0に設定すると、 elseステートメントの結果...SQLストアドプロシージャ(@variable = 0)が機能しない場合

何がうまくいかないのを知っている人は誰ですか? Thxを

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[Pool_select] 

@PartnerCode nvarchar(8), 
@GebrID int, 
@PoolID int, 
@Bevoegdheid int 

AS 

IF (@PoolID = 0) 
BEGIN 
    IF (@Bevoegdheid < 3) 
    BEGIN 
     SELECT 
     p.*, 
     pr.poolrecht 
     FROM racpPool p, racpPoolrecht pr 
     WHERE 
     p.poolid = pr.poolid and 
     p.PartnerCode = @PartnerCode and 
     pr.poolrecht > 0 and 
     p.actief = 1 and 
     pr.GebrID = @GebrID 
    END 
    ELSE 
    BEGIN 
     SELECT * 
     FROM racpPool p 
     WHERE standaardpool = 1 
     and partnercode = @PartnerCode 
    END  
END 
ELSE 
BEGIN 
    IF (@Bevoegdheid < 3) 
    BEGIN 
     SELECT 
     p.*, 
     pr.poolrecht 
     FROM racpPool p, racpPoolrecht pr 
     WHERE 
     p.poolid = pr.poolid and 
     p.PartnerCode = @PartnerCode and 
     pr.poolrecht > 0 and 
     p.actief = 1 and 
     pr.GebrID = @GebrID and 
     p.PoolID = @PoolID 
    END 
    ELSE IF (@Bevoegdheid >= 3) 
    BEGIN 
     SELECT * 
     FROM racpPool p 
     WHERE PoolID = @PoolID 
    END 
END 
+0

@PoolIDはゼロですか?あなたはSSMSでそれを実行する場合、期待どおりの結果を得るのですか? – Paddy

+0

あなたの他の変数についても確かですか? 'ELSE'では' @ Partnercode'をフィルタリングしませんが、 'IF'の上に... – JNK

+1

SQL Server Profilerを実行して、実際に何がプロシージャに送られているのか確認しましたか? – Brandon

答えて

0

あなたは4部構成のUNION ALLの単一選択1として、それを書き換えることができます。

あなたの条件は包括的ではなく、意図的なものかどうかはわかりません。 @PoolID = 0の第二支店で

は、テストでは、具体的 @Bevoegdheid < 3@Bevoegdheid IS NULL

オプティマイザのみ< < <

でマークされた基準に適合した分岐を実行する場合は何もしないであろう(代わりにELSEの) @Bevoegdheid >= 3です
ALTER PROCEDURE [dbo].[Pool_select] 
@PartnerCode nvarchar(8), 
@GebrID int, 
@PoolID int, 
@Bevoegdheid int 
-- WITH RECOMPILE -- << may need this 

AS 

    SELECT 
    p.*, 
    pr.poolrecht 
    FROM racpPool p, racpPoolrecht pr 
    WHERE 
    p.poolid = pr.poolid and 
    p.PartnerCode = @PartnerCode and 
    pr.poolrecht > 0 and 
    p.actief = 1 and 
    pr.GebrID = @GebrID 
    AND @PoolID = 0 and @Bevoegdheid < 3 --- <<< 
UNION ALL 
    SELECT *, NULL 
    FROM racpPool p 
    WHERE standaardpool = 1 
    and partnercode = @PartnerCode 
    AND @PoolID = 0 and IsNull(@Bevoegdheid,4) >= 3 --- <<< 
UNION ALL 
    SELECT 
    p.*, 
    pr.poolrecht 
    FROM racpPool p, racpPoolrecht pr 
    WHERE 
    p.poolid = pr.poolid and 
    p.PartnerCode = @PartnerCode and 
    pr.poolrecht > 0 and 
    p.actief = 1 and 
    pr.GebrID = @GebrID and 
    p.PoolID = @PoolID 
    AND Isnull(@PoolID,-1) <> 0 AND @Bevoegdheid < 3 --- <<< 
UNION ALL 
    SELECT *, NULL 
    FROM racpPool p 
    WHERE PoolID = @PoolID 
    AND Isnull(@PoolID,-1) <> 0 AND @Bevoegdheid >= 3 --- <<< 
+0

あなたのコードはThxで、これは私より優れています。私の問題は、ストアドプロシージャの変数と同じ順序で変数を渡さなかったことです。本当に奇妙な... – Ben

関連する問題