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

Sql server 多语句表值函数有问题,我做错了什么?,sql-server,tsql,function,Sql Server,Tsql,Function,我对这个函数有问题,好像@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
@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

我知道SQL Server 2008支持组合声明/分配,但您是否尝试过将它们分开

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

为变量指定一个值 串联。该值可以是常量 或者一个表达式,但它必须 匹配变量声明类型或 可以隐式地转换为那个 类型

当然,udf是一个表达式,但在DECLARE中使用时是否可能存在一些异常(比如在CHECK约束中使用udf:它不可靠)。或者出于某种原因将ins声明为udf

请迁就我。试试看


此外,在dbo.passwordCorrecto中没有“failsafe”,这意味着它可能返回NULL,而在外部udf中,NULL的计算结果将始终为false

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

我找到了一个解决方案,似乎使用select
@var=some\u value
不起作用

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

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;

您使用的是什么版本的SQL Server?在2005年或更早的版本中,不能在同一行上声明和设置变量。@LittleBobby-但这会引起语法错误。我怀疑问题一定出在dbo.usuarioExiste(@usuario)@Martin Smith的定义或调用中——我在发布后也想到了这一点,但我想问一下也无妨。@bobby我正在使用sql server 2008@Martin'usuarioExiste(@usuario)')在我这样称呼它时效果很好,“SELECT dbo.usuarioExiste('htorres')”。@idUsuario和@passCorrecto在声明后立即的值是什么?嗨,我已经尝试了具有相同结果的独立语句。。。另外,你能给我解释一下故障保护是如何工作的吗?谢谢,函数中不允许gbnprinting,好吧,当我放入类似PRINT@idUsuarioOK的内容时,它显示了一个错误,请尝试创建另外两个只声明和返回变量值的函数。那么这不是问题所在。尝试在函数声明之外执行Select,以确定问题是否与Select有关。
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;