В самом запросе есть проблема, вам нужно заключить в скобки операторы or
, иначе оператор всегда будет возвращать строку, когда имя пользователя совпадает в таблице:
SELECT username,password,emailid
FROM users
WHERE ( username=isnull(@username,null) or emailid=isnull(@emailid,null) )
and [password]=@password
Во-вторых, вы не должны хранить пароли в виде открытого текста. Пожалуйста, прочитайте что-то вроде этой статьи о том, как подсолить и хэшировать ваши пароли
Что касается стиля, я бы лично так не поступил. Как уже отмечали другие, isnull () в этом случае аналогично тому, как не использовать его. Вы также можете сократить использование @@ rowcount, просто установив @ret в операторе select. Если он не возвращает строк, он не будет установлен, поэтому он достигнет того же конца.
Так что я бы написал так:
create procedure users_login (
@username varchar(50),
@password varchar(50),
@emailid varchar(50),
@ret int output
)
as
begin
set @ret=0
select @ret=1
from users
where (username=isnull(@username,null) or emailid=isnull(@emailid,null)
and [password]=@password
end