如何修复“当子查询没有引入EXISTS时,在选择列表中只能指定一个表达式”的错误?

14

我正在尝试在 MS SQL 2012 Express 上运行以下查询:

Select (
    Select Id, Salt, Password, BannedEndDate
    from Users
    where username = '" + LoginModel.Username + "'
), (
    Select Count(*)
    From LoginFails
    where username = '" + LoginModel.Username + "'
    And IP = '" + Request.ServerVariables["REMOTE_ADDR"] + "')"
);

但是我遇到了以下错误:

当子查询未使用EXISTS引入时,select列表中只能指定一个表达式。

我该如何解决这个问题?


10
你在第一个子查询中选择了多列。但是每个子查询只能返回一列。 - Tim Schmelter
1
你还应该了解SQL注入。你正在直接使用请求变量在动态创建的SQL中——这是非常糟糕的编码风格。 - user330315
我正在为每个具有用户输入的查询使用参数,用户名只能包含数字和字母。这是由模型进行检查的。(我正在使用asp.net mvc)。谢谢你的提示! - Jamie
2个回答

7
尝试这个 -
"SELECT 
       ID, Salt, password, BannedEndDate
     , (
          SELECT COUNT(1)
          FROM dbo.LoginFails l
          WHERE l.UserName = u.UserName
               AND IP = '" + Request.ServerVariables["REMOTE_ADDR"] + "'
      ) AS cnt
FROM dbo.Users u
WHERE u.UserName = '" + LoginModel.Username + "'"

谢谢您的评论,但我选择使用mortb的查询,因为它稍微短一些。 - Jamie

7

试试这个:

 Select 
    Id, 
    Salt, 
    Password, 
    BannedEndDate, 
    (Select Count(*) 
        From LoginFails 
        Where username = '" + LoginModel.Username + "' And IP = '" + Request.ServerVariables["REMOTE_ADDR"] + "')
 From Users 
 Where username = '" + LoginModel.Username + "'

我强烈建议您在查询中使用参数,以避免SQL注入攻击的安全风险!

希望这能帮到你!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接