Sql server 如何使用以下用例在SQL中获取记录

Sql server 如何使用以下用例在SQL中获取记录,sql-server,Sql Server,我有一个用例,在这个用例中,我必须从passwordhistory表中获取最后五个密码,其中有两列,第一列是md5加密的,第二列是散列,在检索五条记录之后,我必须将这些列与新密码进行比较,在将它们从md5和散列函数中移动之后,如果找到任何记录,则返回true,否则返回false DECLARE @UserID INT = 6 DECLARE @Password NVARCHAR(200)='admin1952' SELECT * FROM ( SELECT TOP 5

我有一个用例,在这个用例中,我必须从passwordhistory表中获取最后五个密码,其中有两列,第一列是md5加密的,第二列是散列,在检索五条记录之后,我必须将这些列与新密码进行比较,在将它们从md5和散列函数中移动之后,如果找到任何记录,则返回true,否则返回false

DECLARE @UserID INT = 6 
DECLARE @Password NVARCHAR(200)='admin1952'


SELECT  *
FROM    ( SELECT TOP 5
                    ChangedPassword AS ChangedPassword ,
                    PasswordChangeHistory.Password_Hash AS Password_Hash
          FROM      PasswordChangeHistory WITH ( NOLOCK )
                    INNER JOIN [User] U WITH ( NOLOCK ) ON PasswordChangeHistory.UserID = U.Id
          WHERE     PasswordChangeHistory.UserID = @UserID
        )  AS result       
WHERE   PasswordChangeHistory.ChangedPassword = dbo.Encrypt_MD5(@Password)

要回答主题行中的问题,这里有一种方法(在psuedocode中):


当然,如果您确实在寻找“True”和“False”,也可以将1和0替换为“True”和“False”。

您也可以在查询后尝试:

if @@rowcount >0
   select 'user found'
else
   select 'user not found'

这是问题的解决办法。正如我前面所解释的,我需要表中的五条记录,然后用现有的五条记录检查新密码,如果这个新密码与以前的密码匹配,那么返回false,否则返回true

DECLARE @UserID INT = 6 
DECLARE @Password NVARCHAR(200)= 'admin1958'
SELECT * FROM  
( SELECT    TOP(5)    ChangedPassword AS Changed ,PasswordChangeHistory.Password_Hash AS Password_Hash

          FROM      PasswordChangeHistory WITH ( NOLOCK )
                    INNER JOIN [User] U WITH ( NOLOCK ) ON PasswordChangeHistory.UserID = U.Id
          WHERE     PasswordChangeHistory.UserID = @UserID
          ORDER BY  PasswordChangeHistory.ID DESC

) AS result

WHERE result.Changed= dbo.Encrypt_MD5(@Password) or result.Password_Hash = dbo.Encrypt_SHA2(@Password)

选择顶部(5)是什么?您知道,如果返回任何行,则返回的最后一行将被分配给changedpassword@密码从未分配值,而是传递给加密_md5?我们是否缺少一些代码?您当前的尝试有什么问题?它不会返回true/false。我个人认为它只需要在外部选择中进行计数,如果计数>=1,则为1,否则为0<代码>当count(*)>=1时选择case,然后1 else 0结束为以前使用的值并删除其他选择值。问题是当我运行此查询时,在where out selects上给出错误,但我的查询尚未返回任何内容,我需要满足我需要的查询如果这是答案,请将其标记为结束问题。我今天不允许。我将在明天这样做。
DECLARE @UserID INT = 6 
DECLARE @Password NVARCHAR(200)= 'admin1958'
SELECT * FROM  
( SELECT    TOP(5)    ChangedPassword AS Changed ,PasswordChangeHistory.Password_Hash AS Password_Hash

          FROM      PasswordChangeHistory WITH ( NOLOCK )
                    INNER JOIN [User] U WITH ( NOLOCK ) ON PasswordChangeHistory.UserID = U.Id
          WHERE     PasswordChangeHistory.UserID = @UserID
          ORDER BY  PasswordChangeHistory.ID DESC

) AS result

WHERE result.Changed= dbo.Encrypt_MD5(@Password) or result.Password_Hash = dbo.Encrypt_SHA2(@Password)