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

Попробуйте поставить его в 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 

Если вы не прикладывая Бегин END, то объем вашего еще заявления только следующая строка, которая становится выполнена т.е. , INSERT INTO table1 (userID, userName) VALUES (@userid, @name) находится только под номером else. И SET @status = 1 выходит за пределы else Блок. Поэтому, как только else блок выполняет следующий запрос будет выполнен, который SET @status = 1

На стороне записки:

При проверке if exists тогда не использовать * подстановочные. Вместо этого вы можете использовать 1 i.e,

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 

Изменить код, как описано выше. Вы не определили сферу своего. Это было только заявление о вставке. SET @status = 1 был выполнен каждый раз

Смежные вопросы