Devez déclarer la variable scalaire erreur de procédure stockée

J'ai procédure stockée suivante:

CREATE procedure validateLogin    
(    
@password varchar(200),    
@username varchar(100),  
@IpAddress   varchar(100)  
)    
AS    
BEGIN    
Declare @qry varchar(max), @LockedIp varchar(max), @LockedTime DateTime, @TimeDifference int;    
set @qry = 'select IdUser, UserName, FirstName, LastName, idOrg, Users.idRole, Roles.Title as [Role], Allowed_IP from Users, Roles where Users.idRole = Roles.idRole    
and lower(UserName) = @username and [password] = @password' ;    
select 
@LockedIp = isnull(Allowed_IP,''),
@LockedTime = isnull(LockedTime, getDate()) 
from Users 
where UserName = ISNULL(@username,'');    
SELECT 
@TimeDifference = DATEDIFF(MINUTE, @LockedTime, GETDATE())    
IF exists(select * from Users where UserName = @username AND Password = @password AND Active = 1)    
BEGIN     
IF exists(select * from Users where UserName = @username AND isnull(IsLocked, 0) = 1)    
BEGIN -- BE1    
IF(@LockedIp = @IpAddress)     
BEGIN --BE2    
IF (@TimeDifference >5)    
BEGIN --BE5    
UPDATE Users 
SET IsLocked = 0, LockedTime = null 
WHERE UserName = ISNULL(@username,'')  
exec(@qry);    
END --BE5    
ELSE     
BEGIN    
select 'Your Account has been Locked.Try after some time' as Error    
END    
END --BE2    
Else IF(@LockedIp!=@IpAddress)     
BEGIN --BE4    
UPDATE Users 
SET IsLocked = 0, LockedTime = null 
WHERE UserName = isnull(@username,'')  
exec(@qry);    
END --BE4    
END -- BE1    
Else    
BEGIN --BE3    
exec(@qry);    
END -- BE3    
END      
END 
Go

Quand j'execute ce à travers:

exec validateLogin '|161|217|4|51','admin','127.0.0.1' 

J'obtiens l'erreur suivante:

Msg 137, Niveau 15, État 2, Ligne 3

Devez déclarer la variable scalaire "@username".

J'ai déclaré cette variable dans ma liste de paramètres, puis également d'erreur s'affiche.

S'il vous plaît aider moi.

Comment puis-je résoudre ce problème?

  • Votre les variables ont une portée limitée; lorsque vous appelez exec(@qry) les variables de ne pas passer à travers. Rechercher à l'aide de sp_executesql au lieu de exec, il a une syntaxe qui permet de passer des paramètres. technet.microsoft.com/en-us/library/ff848746.aspx
  • cela sera fait?? set @req ='select IdUser,nom d'utilisateur,FirstName,LastName,idOrg,les Utilisateurs.idRole,les Rôles.Titre [Rôle],Allowed_IP des Utilisateurs,des Rôles où les Utilisateurs.idRole=Rôles.idRole et inférieure(nom d'utilisateur)='+@nom d'utilisateur+ " et [mot de passe]='+@mot de passe ;
  • Cela fonctionne, mais c'est une mauvaise idée pour toutes sortes de raisons (attaques par injection sql, pas de plan d'exécution de la réutilisation, de la difficulté à lire et à déboguer, oubliant correctement intégrer ' et des caractères d'échappement, d'une malformation des cordes pour différents types de données, etc, etc). Je recommande fortement d'utiliser sp_execuetsql au lieu de exec.
  • mais je vais exécuter cette .net, alors, en utilisant la méthode executenonquery()... ce n'est pas aussi en cours d'exécution .net et sur local sqlserver j'ai essayé avec exec,puis aussi de ne pas couru..
InformationsquelleAutor C Sharper | 2014-04-14