проблема с многозначной табличной функцией, что я делаю неправильно? - PullRequest
0 голосов
/ 14 сентября 2010

У меня проблемы с этой функцией, похоже, что @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

Что я делаю не так?

EDIT

Вот функция, использованная выше:

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

Как предположил Бет, я создал новые функции, которые возвращают нужные мне значения, например:

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 ]

0 голосов
/ 14 сентября 2010

попробуйте распечатать значения переменных после их объявления. Если они установлены неправильно, попробуйте вызывать функции в новом окне запроса, а не в [dbo]. [Login]. Это должно помочь выявить проблему.

0 голосов
/ 15 сентября 2010

Я нашел решение, похоже, что использование select @var = some_value не работает. См. Это:

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

Это фиксированные функции: 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;

и логин

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 голосов
/ 14 сентября 2010

Я знаю, что SQL Server 2008 поддерживает комбинированное DECLARE / assign, но вы пытались их разделить?

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

From BOL

Назначаетзначение переменной в строке.Значение может быть константой или выражением, но оно должно соответствовать типу объявления переменной или быть неявно конвертируемым в этот тип.

Конечно, udf является выражением, но возможно ли, что в DECLARE есть некоторая аномалия (например, когда вы используете udf в ограничении CHECK: это ненадежно).Или ОБЪЯВЛЯЙТЕ в udf по какой-то причине.

Пожалуйста, приколите меня.Попробуйте.

Кроме того, у вас нет "failsafe" внутри dbo.passwordCorrecto, что означает, что он может возвратить NULL, который всегда будет иметь значение false во внешнем udf.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...