代码之家  ›  专栏  ›  技术社区  ›  Eduardo Rascon

多语句表值函数有问题,我做错了什么?

  •  0
  • Eduardo Rascon  · 技术社区  · 14 年前

    我觉得这个函数有问题 @idUsuario @passCorrecto 没有得到任何值,所以,当我在where子句中使用这个变量时,我没有得到任何结果数据。

    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
    

    编辑

    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
    

    编辑2

    按照Beth的建议,我创建了新函数,返回我需要的值,如下所示:

    CREATE FUNCTION [dbo].[usuarioExisteTest]
    (
        @usuario varchar(20)
    )
    RETURNS int
    AS
    BEGIN
    
        declare @idUsuario int;
        set @idUsuario = 1;
    
        return (@idUsuario);
    
    END;
    

    通过这样做,我得到了我需要的数据,我是否设置了返回原始函数的错误方式的值?

    DECLARE @idUsuario integer
    
            SELECT
                @idUsuario = idUsuario
            FROM
                usuarios
            WHERE
                usuario = @usuario
    
    3 回复  |  直到 14 年前
        1
  •  0
  •   gbn    14 年前

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

    From BOL

    为变量赋值 或者一个表达式,但它必须 匹配变量声明类型或 可以隐式地转换为 类型。

    当然,自定义项

    请逗乐我。试试看。

    此外,你没有“故障保险”里面 dbo.passwordCorrecto

        2
  •  0
  •   Beth    14 年前

    在声明变量后,请尝试打印它们的值。如果设置不正确,请尝试在新的查询窗口中而不是在[dbo].[login]中调用这些函数。这应该有助于找出问题所在。

        3
  •  0
  •   Eduardo Rascon    14 年前

    @var = some_value See this:

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

    这些是固定功能: 通常存在

    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;
    

    密码校正器

    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;
    

    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;