【问题标题】:How to fix "Only one expression can be specified in the select list when the subquery is not introduced with EXISTS" error?如何解决“当子查询不引入 EXISTS 时,选择列表中只能指定一个表达式”错误?
【发布时间】:2013-06-28 12:22:10
【问题描述】:

我正在尝试在 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列表中只能指定一个表达式。

我该如何解决这个问题?

【问题讨论】:

  • 您在第一个子查询中选择了多个列。但是每个子查询只能返回一列。
  • 您还应该阅读 SQL 注入。您在动态创建的 SQL 中直接使用请求变量 - 非常糟糕的编码风格。
  • 我为每个有用户输入的查询使用参数,用户名只能包含数字和字母。模型正在对此进行检查。 (我正在使用 asp.net mvc)。不过感谢您的提示!

标签: sql sql-server tsql exists


【解决方案1】:

试试这个:

 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 注入攻击的安全风险!

希望有帮助!

【讨论】:

  • 这非常有效,非常感谢您的提示!
【解决方案2】:

试试这个 -

"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 的查询,因为它有点短
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 2011-09-24
相关资源
最近更新 更多