2013-07-01 20 views
13

Ben MS SQL 2012 Express aşağıdaki sorguyu çalıştırmak çalışıyorum:Nasıl düzeltebilirim "Alt sorgu EXISTS ile eklenmediğinde seçim listesinde yalnızca bir ifade belirtilebilir" hatası?

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"] + "')" 
); 

Ama aşağıdaki hatayı alıyorum:

Only one expression can be specified in the select list when the subquery is not introduced with EXISTS .

Bu sorunu nasıl çözebilir?

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 + "' 

Ve sql enjeksiyon saldırıları ile güvenlik risklerini önlemek için sorguda parametreleri kullanmak önemle tavsiye ederiz:

"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 + "'" 
+10

İlk alt sorgunuzda birden fazla sütun seçiyorsunuz. Ancak her bir alt sorgu yalnızca bir sütun döndürür. –

+1

Ayrıca SQL enjeksiyonunu da okumalısınız. Doğrudan dinamik olarak oluşturulmuş bir SQL'de bir istek değişkeni kullanıyorsunuz - Çok kötü kodlama stili. –

+0

Kullanıcı girdisi olan her sorgu için parametreleri kullanıyorum, kullanıcı adı yalnızca sayı ve harf içerebilir. Bu model tarafından kontrol ediliyor. (Asp.net mvc kullanıyorum). İpucu için teşekkürler! – Jamie

cevap

7

bu deneyin -

+0

Bu mükemmel çalışıyor, çok teşekkürler ve bahşiş için teşekkürler! – Jamie

6

bu bir deneyin!

Bu yardımcı olur umarım!

+0

Yorumunuz için teşekkürler, ama mortb sorgusunu kullanmayı tercih ettim çünkü biraz daha kısa – Jamie