2010-09-14 5 views
0

J'ai des problèmes avec cette fonction, semble @idUsuario et @passCorrecto ne reçoivent aucune valeur, donc, quand j'utilise ces variables dans la clause where, je ne reçois aucune donnée de résultat.problème avec la fonction de table de déclaration multi-valeur, qu'est-ce que je fais mal?

ALTER FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20)) 

RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null) 
AS 
BEGIN 
    DECLARE @idUsuario int = dbo.usuarioExiste(@usuario) 
    DECLARE @passCorrecto bit = dbo.passwordCorrecto(@idUsuario, @password) 

    INSERT @info 
     SELECT 
      usuarios.nombreUsuario, tiposUsuarios.tipoUsuario 
     FROM 
      usuarios 
     LEFT JOIN 
      tiposUsuarios 
     ON 
      usuarios.idTipoUsuario = tiposUsuarios.idTipoUsuario 
     WHERE 
      usuarios.idUsuario = @idUsuario and    
      usuarios.estatus = 'ACTIVO' and 
      @passCorrecto = 1 
    RETURN 

END 

Qu'est-ce que je fais mal?

EDIT

Voici les fonctions utilisées ci-dessus:

ALTER FUNCTION [dbo].[usuarioExiste] 
(
    @usuario varchar(20) 
) 
RETURNS integer 
AS 
BEGIN 

    DECLARE @idUsuario integer 

    SELECT 
     @idUsuario = idUsuario 
    FROM 
     usuarios 
    WHERE 
     usuario = @usuario 

    if @idUsuario is null begin 
     set @idUsuario = 0 
    end 

    RETURN @idUsuario 

END 


ALTER FUNCTION [dbo].[passwordCorrecto] 
(
    @usuario varchar(20), 
    @password varchar(20) 
) 
RETURNS bit 
AS 
BEGIN 

    DECLARE @esCorrecto bit 

    SELECT 
     @esCorrecto = case when password = @password then 1 else 0 end 
    FROM 
     usuarios 
    WHERE 
     usuario = @usuario 

    RETURN @esCorrecto 

END 

EDIT 2

Comme suggéré par Beth, j'ai créé de nouvelles fonctions qui renvoie les valeurs que j'ai besoin comme ceci:

CREATE FUNCTION [dbo].[usuarioExisteTest] 
(
    @usuario varchar(20) 
) 
RETURNS int 
AS 
BEGIN 

    declare @idUsuario int; 
    set @idUsuario = 1; 

    return (@idUsuario); 

END; 

En faisant cela, je reçois les données dont j'ai besoin, est-ce que je règle les valeurs pour retourner dans le mauvais sens dans les fonctions d'origine?

DECLARE @idUsuario integer 

     SELECT 
      @idUsuario = idUsuario 
     FROM 
      usuarios 
     WHERE 
      usuario = @usuario 
+1

Quelle version de SQL Server sont vous u chanter? Vous ne pouvez pas déclarer et définir des variables sur la même ligne en 2005 ou avant. – LittleBobbyTables

+1

@LittleBobby - Cela soulèverait une erreur de syntaxe si. Je soupçonne que la question doit être dans la définition ou l'appel de 'dbo.usuarioExiste (@usuario)' –

+0

@ Martin Smith - J'ai pensé à cela aussi, après que je l'ai posté, mais je pensais qu'il ne pouvait pas faire mal à demander. – LittleBobbyTables

Répondre

0

J'ai trouvé une solution, semble utiliser @var = some_value ne fonctionne pas bien.See this:

A SELECT statement that contains a variable assignment cannot be used to also perform typical result set retrieval operations. 

Ce sont les fonctions fixes: usuarioExiste

CREATE FUNCTION [dbo].[usuarioExiste] 
(
    @usuario varchar(20) 
) 
RETURNS int 
AS 
BEGIN 

    declare @idUsuario int = 0; 

    set @idUsuario = (
     select 
      idUsuario 
     from 
      usuarios 
     where 
      usuario = @usuario); 

    if @idUsuario is null begin 
     set @idUsuario = 0; 
    end; 

    return (@idUsuario); 

END; 

passwordCorrecto

CREATE FUNCTION [dbo].[passwordCorrecto] 
(
    @idUsuario int, 
    @password varchar(20) 
) 
RETURNS bit 
AS 
BEGIN 

    declare @esCorrecto bit = 'false'; 

    set @esCorrecto = (
     select 
      case when password = @password then 'true' else 'false' end 
     from 
      usuarios 
     where 
      usuarios.idUsuario = @idUsuario); 

    return (@esCorrecto); 

END; 

et se connecter

CREATE FUNCTION [dbo].[login](@usuario varchar(20), @password varchar(20)) 

RETURNS @info TABLE (nombre varchar(70) not null, tipo varchar(30) not null) 
AS 
BEGIN 

    DECLARE @idUsuario int = dbo.usuarioExistetest(@usuario); 

    DECLARE @passCorrecto bit = dbo.passwordCorrectotest(@idUsuario, @password); 

    INSERT @info 
     SELECT 
      usuarios.nombreUsuario, tiposUsuarios.tipoUsuario 
     FROM 
      usuarios 
     LEFT JOIN 
      tiposUsuarios 
     ON 
      usuarios.idTipoUsuario = tiposUsuarios.idTipoUsuario 
     WHERE 
      usuarios.idUsuario = @idUsuario and 
      usuarios.estatus = 'ACTIVO' and 
      @passCorrecto = 'true'; 
    RETURN 

END; 
+0

ahh, vous l'avez trouvé! – Beth

0

Je sais SQL Server 2008 prend en charge la DECLARE/Assign combinés, mais avez-vous essayé de les séparer?

DECLARE @idUsuario int 
SET idUsuario = dbo.usuarioExiste(@usuario) 
DECLARE @passCorrecto bit 
SET passCorrecto = dbo.passwordCorrecto(@idUsuario, @password) 

From BOL

affecte une valeur à la variable dans ligne. La valeur peut être une constante ou une expression, mais doit correspondre au type de déclaration de variable ou être implicitement convertible en ce type .

Bien sûr, un udf est une expression, mais il est possible qu'il y ait une certaine anomalie lorsqu'il est utilisé dans DECLARE (comme lorsque vous utilisez une udf en contrainte CHECK: ce n'est pas fiable). Ou DECLARE ins un udf pour une raison quelconque.

S'il vous plaît humour moi. Essayez-le.

De plus, vous n'avez pas de "failsafe" à l'intérieur dbo.passwordCorrecto ce qui signifie qu'il pourrait retourner NULL qui sera toujours évalué à false dans le fichier udf externe.

+0

Salut, j'ai déjà essayé des déclarations séparées avec le même résultat ... aussi, pourriez-vous m'expliquer comment fonctionne la sécurité intégrée? merci gbn –

0

Essayez d'imprimer les valeurs des variables après les avoir déclarées. Si elles ne sont pas définies correctement, essayez d'appeler les fonctions dans une nouvelle fenêtre de requête au lieu de [dbo]. [Login]. Cela devrait aider à identifier le problème.

+0

l'impression n'est pas autorisée dans les fonctions beth, eh bien, il me montre une erreur quand je mets quelque chose comme PRINT @idUsuario –

+0

OK, essayez de créer deux autres fonctions qui déclarent et retournent uniquement vos valeurs de variables. – Beth

+0

Quand je change les fonctions à ce que vous avez dit cela fonctionne bien –

Questions connexes