2016-05-11 3 views
2

インサートストアドプロシージャを実装しようとしています。基本的には、レコードが存在するかどうかをチェックして、挿入を実行するように動作するのはstored procedureです。変数@statusが指標として使用されます。しかし、このqueryの問題は、queryを実行すると、データが存在するかどうかにかかわらず結果が@status = 1であることがわかります。しかし、INSERTの機能は問題ありません。ちょうど@statusです。以下は、私の実装です:SQLストアドプロシージャIF ELSE論理エラー

CREATE PROCEDURE save_proc 
(
    @userid varchar(10) 
    @name varchar(30) 
) 

AS 

DECLARE @status int 

    if exists (SELECT * FROM table1 where userID = @userid AND userName = @name) 
    SET @status = 0 

    else 
    INSERT INTO table1 (userID, userName) VALUES (@userid, @name) 
    SET @status = 1 

SELECT @status 

答えて

0

実行された= SETの@statusを使用すると、BEGIN ENDを入れていない場合BEGIN END

CREATE PROCEDURE save_proc 
(
    @userid varchar(10) 
    @name varchar(30) 
) 

AS 

DECLARE @status int 

    if exists (SELECT * FROM table1 where userID = @userid AND userName = @name) 
    SET @status = 0 

    else 
    begin 
     INSERT INTO table1 (userID, userName) VALUES (@userid, @name) 
     SET @status = 1 
    end 

にそれを置くようにしてください、あなたのelse文の範囲は、すなわち実行なっているだけで、次の行でありますINSERT INTO table1 (userID, userName) VALUES (@userid, @name)は、elseブロックの範囲にある。 SET @status = 1はブロックelseの範囲外です。 elseブロックが実行されるので、一度、次のクエリは、サイドノートでSET @status = 1

である実行されます:あなたはif existsをチェックされている場合は、その後*、ワイルドカードを使用していない

。代わりに、1、つまり

if exists (SELECT 1 FROM table1 where userID = @userid AND userName = @name) 
を使用できます
0
else 
begin 
    INSERT INTO table1 (userID, userName) VALUES (@userid, @name) 
    SET @status = 1 
end 

上記のようにコードを変更します。あなたは他人の範囲を定義していません。これは、INSERTステートメントのみでした。 1は毎回