2015-11-06 2 views
1

У меня есть хранимая процедура, в которой я проверяю, существует ли имя пользователя, и если оно не существует, добавьте в таблицу пользователя, затем получите идентификатор пользователя для того же имени пользователя. Я пытался использовать выходную переменную, чтобы получить идентификатор пользователя. Я собираюсь сделать это неправильно?Могу ли я использовать выходные переменные для получения значения?

alter Procedure Check_User_Name 
(
    @username varchar(25), 
    @password varchar(100), 
    @role_id integer, 
    @idn nvarchar output 
) 
As 
Begin 
    IF NOT EXISTS(SELECT [email protected] 
     FROM [user] WHERE username = @username) 
    BEGIN 
     INSERT INTO [user] (username,[password],role_id) VALUES 
     (@username, @password,@role_id) 
     --select @idn=idn from [user] 
     Print 'UserName inserted successfully' 
    End 
    Else IF EXISTS(SELECT * FROM [user] WHERE username = @username) 
    Begin 
     Print 'UserName already exists' 
    End 
END 

ответ

1

У вас было это близко - после замены имен столбцов в соответствии с тем, что находится в моей таблице пользователей, это сработало для меня. (Я думаю, что я все заменил).

На вашем Else вы в основном выполняете второй поиск по имени пользователя - что в этом случае не нужно.

ALTER Procedure Check_User_Name 
    (
@username varchar(25), 
@password varchar(100), 
@role_id integer, 
@idn nvarchar(20) output 
) 
As 
Begin 
     IF NOT EXISTS(SELECT idn 
     FROM [user] WHERE username = @username) 
      BEGIN 
       INSERT INTO [user] (username,[password], role_id) VALUES 
       (@username, @password) 
       select @idn=idn from [user] WHERE username = @username 
       Print 'UserName inserted successfully' 
      End 
      Else 
       Begin 
        Print 'UserName already exists' 
        SELECT @idn = idn FROM [user] 
        WHERE username = @username 
       End 

END 
GO 

Выполнить с:

DECLARE @idnOut nVarChar(20) 
exec Check_User_Name @username = 'user2127184', @password = 'asdf', @role_id = 0, @idn = @idnOut OUTPUT 
SELECT @idnOut 
+0

я указал размер на @idn переменной, что вам нужно подтвердить. Опуская размер по умолчанию - 30 [SO Ref] (http://stackoverflow.com/questions/1131499/what-is-the-effect-of-omitting-size-in-nvarchar-declaration) – InbetweenWeekends

+0

он работал. в то время как я здесь, как вы можете видеть в моем коде, что он не использует обработку ошибок только для печати заявлений. могу ли я использовать, например, ошибку try, catch или @@? – user2127184

+0

Это зависит от того, что делает остальная часть вашего кода. Я не уверен, что буду беспокоиться об этом, так как вы просто вставляете вставку. Если вставку/выбор не удается, я (лично) просто займусь этим в своем приложении. – InbetweenWeekends

0

Вы можете использовать параметры, но я всегда избегаю параметров в SQL, как я делаю на C# по тем же причинам.

Если у вас есть набор результатов только с UserId:

select @UserId; 

то расширить его, чтобы включить другие вещи позже:

select @UserId, @UserGuid; 

без особых проблем.

Даже если вам нужно вернуть статус (Вход Разрешено/Locked Out) и подробности вы можете просто использовать несколько наборов результатов:

select @Status; 
select @UserId; //etc. 

Если у вас есть из параметров, вы должны изменить подпись процедуры - что может быть проблемой, если вы поддерживаете несколько клиентов, вызывающих это.

Единственное изменение, которое необходимо внести в вызывающий код с наборами результатов, - это продолжить поиск нового столбца из набора результатов.

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