2

我正在做这样的密码验证查询。

if exists(select UserID from users where UserName=@UserName and Password=@Password) 
    select UserID from users where UserName=@UserName and Password=@Password
else 
    select 0

但在我看来,我为一个结果查询了两次我可以这样做吗

Select UserID Where Username = @UserName and Password = @Password

当我得到我的结果时,只需检查阅读器的结果数量?

if (!myReader.HasRows)
    MessageBox.Show("UserName not found or Password invalid");
else
    //do login stuff

猜猜我要问的是,哪个更好,或者它们是一样的?

4

1 回答 1

4

用这个:

SELECT  ISNULL
        (
        (
        SELECT  userId
        FROM    users
        WHERE   userName = @userName
                AND password = @password
        ),
        0
        )

您检查记录数量的解决方案当然也可以。

请注意,它将始终只返回一条记录,如果userName不是唯一的并且有重复的@userName.

正如@Andriy M 所指出的,COALESCE这里将无济于事,因为它在内部被重写为CASE容易出现相同问题的地方。

回答您的问题:是的,原始批次将访问users两次。

于 2012-05-31T14:23:33.747 回答