[英]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.