繁体   English   中英

如果存在,然后使用INSERT,SQL Server进行ELSE

[英]IF EXISTS then ELSE with INSERT, SQL Server

我之前的问题最终没有回答我的长期问题,这是:

我需要将User_Passwords密码( up_Password )与传入的新密码( @CurrentPassword )进行比较。 如果他们匹配,我需要返回一个1这样的代码遵循不同的轨迹,而如果它是一个新的密码,它会被INSERTed到表中。 这是我认为正在执行的存储过程部分:

DECLARE @UserNumberOfPasswords INT
DECLARE @ua_pk uniqueidentifier
DECLARE @ResetDaysAmount INT
DECLARE @AllowedNumberOfPasswords INT
DECLARE @CurrentPasswordDate DATE
DECLARE @CurrentPassword varchar(25)

SELECT *
FROM dbo.User_Passwords
WHERE ua_fk = @ua_pk
ORDER BY up_PasswordDate DESC

DELETE FROM User_Passwords
WHERE @ua_pk = ua_fk
AND @CurrentPasswordDate > (DATEADD(DAY, (@ResetDaysAmount - 1), up_PasswordDate))

SELECT *
FROM dbo.User_Passwords
WHERE ua_fk = @ua_pk
ORDER BY up_PasswordDate ASC

SELECT @UserNumberOfPasswords = COUNT(*)    
FROM User_Passwords AS up
WHERE ua_fk = @ua_pk

IF @UserNumberOfPasswords > @AllowedNumberOfPasswords
BEGIN
    WITH T
    AS (SELECT TOP (@UserNumberOfPasswords - @AllowedNumberOfPasswords) *
        FROM   User_Passwords
        WHERE  ua_fk = @ua_pk
        ORDER BY up_PasswordDate ASC)
    DELETE FROM T; 
END

IF @UserNumberOfPasswords = @AllowedNumberOfPasswords
BEGIN
    WITH T
    AS (SELECT TOP 1 *
        FROM User_Passwords
        WHERE ua_fk = @ua_pk
        ORDER BY up_PasswordDate ASC)
    DELETE FROM T;
END

IF EXISTS 
    (SELECT 1
    FROM User_Passwords
    WHERE up_Password = @CurrentPassword)
    SELECT 1
ELSE
    INSERT INTO User_Passwords (ua_fk, up_Password, up_PasswordDate)
    VALUES (@ua_pk, @CurrentPassword, @CurrentPasswordDate

我已经做了很多测试,得出的结论是,它总是返回1 ,但我不确定为什么。

底线-我想比较值,如果值相等,请使用一个值返回VB.Net,以便可以将其用于不同的代码路径,而如果它们不相等,则将其添加到表,然后返回到我的VB.Net代码。

DECLARE @result integer;   

IF EXISTS         (SELECT 1
                   FROM User_Passwords
                   WHERE up_Password = @CurrentPassword)
  BEGIN
    SET @result = 1;
  END;
ELSE
 BEGIN
    INSERT INTO User_Passwords (ua_fk, up_Password, up_PasswordDate)
    VALUES (@ua_pk, @CurrentPassword, @CurrentPasswordDate);
    SET @result = 0;
 END;

RETURN @result;

代替

IF EXISTS 
    (SELECT 1
    FROM User_Passwords
    WHERE up_Password = @CurrentPassword)
    SELECT 1
ELSE
    INSERT INTO User_Passwords (ua_fk, up_Password, up_PasswordDate)
    VALUES (@ua_pk, @CurrentPassword, @CurrentPasswordDate

不是吗

IF EXISTS 
    (SELECT 1
    FROM User_Passwords
    WHERE up_Password = @CurrentPassword
    AND   ua_fk = @ua_pk ) //Only search for passwords that belong to this user
    SELECT 1
ELSE
    INSERT INTO User_Passwords (ua_fk, up_Password, up_PasswordDate)
    VALUES (@ua_pk, @CurrentPassword, @CurrentPasswordDate

...?

否则,如果任何用户(不仅是感兴趣的用户)都存在密码,则存储过程将返回1,这可能会解释您的结果。

如果需要调试,我通常会添加打印件

IF EXISTS 
    (SELECT 1
    FROM User_Passwords
    WHERE up_Password = @CurrentPassword)
    BEGIN
        PRINT ('EXISTS')
        PRINT ('up_Password:' + up_Password)
        PRINT ('@CurrentPassword:' + @CurrentPassword)
    SELECT 1
    END
ELSE
    BEGIN
        PRINT ('NOT EXISTS')
        PRINT ('up_Password:' + up_Password)
        PRINT ('@CurrentPassword:' + @CurrentPassword)
        INSERT INTO User_Passwords (ua_fk, up_Password, up_PasswordDate)
        VALUES (@ua_pk, @CurrentPassword, @CurrentPasswordDate)
    END

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM