2010-09-14 61 views
0

我有这个功能的问题,好像@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 
+1

什么版本的SQL Server是你的U唱?您不能在2005年或更早的时间在同一行上声明和设置变量。 – LittleBobbyTables 2010-09-14 16:01:39

+1

@LittleBobby - 虽然会引发语法错误。我怀疑这个问题必须出现在dbo.usuarioExiste(@usuario)' – 2010-09-14 16:12:57

+0

@Martin Smith的定义或调用中 - 我在发布它之后也想到了这一点,但是认为它不会受到伤害。 – LittleBobbyTables 2010-09-14 16:20:40

回答

0

我找到了一个解决方案,好像使用select @var = some_value不能正常工作。See this:

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

啊,你找到它了! – Beth 2010-09-15 20:38:19

0

我知道SQL Server 2008支持合并DECLARE /分配,但你有没有尝试过把它们分开?

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

From BOL

指定一个值在线变量 。该值可以是常数 或表达式,但它必须与变量声明类型匹配的 或可隐式转换为 类型的 。

当然,一个UDF 一种表达,但有可能有中声明使用时的一些异常现象(当你在CHECK约束使用UDF这样的:它是不可靠的)。或者出于某种原因声明udf。

请幽默我。尝试一下。

另外,你在dbo.passwordCorrecto里面没有“故障安全”,这意味着它可以返回NULL,它总是在外部udf中计算为false。

+0

嗨,我已经尝试了相同结果的分离陈述......另外,你能向我解释失效保险的工作原理吗?感谢gbn – 2010-09-14 22:29:12

0

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

+0

功能不允许打印beth,好吧,当我把类似PRINT @idUsuario – 2010-09-14 22:32:51

+0

的东西写入时,它显示出错误,请尝试创建另外两个只声明并返回变量值的函数。 – Beth 2010-09-15 14:39:12

+0

当我改变你说的功能,它工作正常 – 2010-09-15 17:25:47