2016-11-24 5 views
0

Ich habe eine Funktion zu überprüfen, ob Benutzer authentifiziert sind, aber das Ergebnis ist nicht korrekt:SQL Server-Funktion Rückkehr unerwartetes Ergebnis

CREATE FUNCTION [dbo].[IsAuthorized] 
    (@UserToken nvarchar(250), 
    @UserCode nvarchar(250)) 
RETURNS int 
AS 
BEGIN 
    IF (SELECT [User].UserId 
     FROM [User] 
     INNER JOIN UserLogin ON [User].UserId = UserLogin.UserId 
     WHERE [User].UserCode = @UserCode 
      AND UserLogin.UserToken = @UserToken 
      AND UserLogin.UserTokenExpiration > GETDATE()) > 0 
     RETURN 1; 

    IF NOT EXISTS (SELECT [User].UserId 
        FROM [User] 
        WHERE [User].UserCode = @UserCode) 
     RETURN -201; -- User does not exist 

    IF NOT EXISTS (SELECT [User].UserId 
        FROM [User] 
        INNER JOIN UserLogin ON [User].UserId = UserLogin.UserId 
        WHERE [User].UserCode = @UserCode 
        AND UserLogin.UserToken = @UserToken) 
     RETURN -202; -- Token is not valid 

    IF EXISTS (SELECT [User].UserId 
       FROM [User] 
       INNER JOIN UserLogin ON [User].UserId = UserLogin.UserId 
       WHERE [User].UserCode = @UserCode 
       AND UserLogin.UserToken = @UserToken 
       AND UserLogin.UserTokenExpiration < GETDATE()) 
     RETURN -203; -- Token expired 

    RETURN 0; 
END 

Wenn ich zu laufen versuchen:

DECLARE @UserCode nvarchar(250) = N'7C6898E2-0529-4C3F-B4B2-FA69087CDF4A'; 
DECLARE @UserToken nvarchar(250)= N'DE3B193D-65BC-4F75-970A-932C9F825D81'; 

SELECT dbo.IsAuthorized(@UserCode,@UserToken) as FunctionResult 

SELECT * 
FROM [User] 
INNER JOIN UserLogin ON [User].UserId = UserLogin.UserId 
WHERE 
    [User].UserCode = @UserCode 
    AND UserLogin.UserToken = @UserToken 
    AND UserLogin.UserTokenExpiration > GETDATE() 

ich dieses Ergebnis zu erhalten :

==> die Funktion finden nicht die Linie

-201 

==> findet die Abfrage eine Zeile

4 7C6898E2-0529-4C3F-B4B2-FA69087CDF4A Ahmed ALOUI TROY [email protected] 0  0 1 0 /Ressources/img/aloui.jpg 4 73828562FADE36DD6774C6854F52965C CC6CA2373C2240743D051352BC3AF3C0 DE3B193D-65BC-4F75-970A-932C9F825D81 2016-11-25 16:02:12.083 

Irgendwelche Hinweise?

+0

Ich versuchte mit EXISTS ... Select count (*) ...> 0 aber das Problem ist in der Funktion, weil die Abfrage korrekt ist und wenn ich es ausführen, gibt das korrekte Ergebnis –

Antwort

0

Der Unterschied ist, dass Sie in Ihrer Funktion eine SELECT ausführen und vergleichen das Ergebnis dieser Auswahl, um zu sehen, ob es größer als Null ist (was nicht funktioniert), während in Ihrem rohen SELECT ohne Verwendung der Funktion, Sie geben nur die gesamten Datensätze zurück, wenn sie gefunden werden.

Sie wollen wahrscheinlich diese in Ihrer Funktion:

IF (SELECT COUNT([User].UserId) 
     FROM [User] 
     INNER JOIN UserLogin ON [User].UserId = UserLogin.UserId 
     WHERE [User].UserCode = @UserCode 
      AND UserLogin.UserToken = @UserToken 
      AND UserLogin.UserTokenExpiration > GETDATE()) > 0 
     RETURN 1; 

, die die Anzahl der Datensätze von Ihrem SELECT zurück zählen wird, und wenn die Zahl größer als Null ist, wird ein Wert von 1 aus der Funktion zurück.

+0

Count wäre am geeignetesten jedoch , solange User.UserId numerisch ist und die Abfrage eine einzelne Zeile (oder einen skalaren Wert) verglichen User.UserId> 0 mit Überschreitungszählung arbeiten produziert. – Matt

0
IF EXISTS (SELECT 1 
    FROM 
     User u 
     INNER JOIN UserLogin l 
     ON u.UserId = l.UserId 
     AND l.UserToken = @UserTokey 
     AND l.UserTokenExpiration = GETDATE() 
    WHERE 
     u.UserCode = @UserCode 
) 
BEGIN 
    RETURN 1; 
END 

So wie Sie User.UserId haben> 0 soll, wenn ein einzelner Skalar numerischer Wert aber nur funktionieren, wird aus der Abfrage zurückgegeben werden. Wenn mehrere zurückgegeben werden, würde es einen Fehler geben. Nach dem, was Sie zeigen, dass scheint, um wahr zu sein, aber vielleicht sind Sie nur einige der Ergebnisse usw. Wie auch immer, in den Rest der Funktion zeigt Ihnen die perfekte Technik verwenden diese auch zu ändern. Verwenden Sie einfach IF EXISTS(SELECT....).

Hinweis es ist ein Hauptärgernis von mir Bedingungen gehören eine verknüpfte Tabelle in der WHERE-Klausel statt der ON-Bedingungen zu beschränken. sie in der ON setzen könnte mehr optimiert, aber Ihre Absichten sind klarer als solche ich die Abfrage diesen Vorschlag zu reflektieren geändert haben.