2010-09-14 64 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