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 desp_executesql
au lieu deexec
, 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'utilisersp_execuetsql
au lieu deexec
. - 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..
Vous devez vous connecter pour publier un commentaire.
EXEC() est exécutée dans un autre champ, de sorte que vos paramètres ne sont pas trouvés. Vous devez utiliser
sp_executesql
et ajouter vos paramètres de cette façon:exec(@qry)
avecEXECUTE sp_executesql @qry, N'@username varchar(100), @password varchar(200)', @Username, @Password;
. Bien que je ne vous conseille pas d'utiliser la méthode ExecuteNonQuery() si vous vous attendez à des résultats!