2012-12-07 44 views
1

下面的sql查詢對CASE WHEN中的所有檢查很有效,接受一些電子郵件。當我每次運行查詢檢查電子郵件有時它有效,有時它不。我做了一個RTRIM(LTRIM(m.Email)),這也不起作用。 比較電子郵件時,我需要做些什麼不同嗎?CASE當不使用電子郵件時

exec BuildingPros.uspGetEmployees 1697,'Email','[email protected]' 


alter proc BuildingPros.uspGetEmployees 
@ProID INT, 
@Where VARCHAR(12) = NULL, 
@Equals VARCHAR(25) = NULL 
AS 
     SELECT m.UserId,u.UserName,e.NonProID'ID',m.Email,c.FirstName'FName',c.LastName'LName', 
         ISNULL(c.Title,'NA')'Title',z.ZIPCode'Zip', p.Phone 
     FROM  Person.UtbAddressesutbContact ac JOIN 
          Person.utbAddresses a ON ac.AddressID = a.AddressID JOIN 
          Person.utbContact c ON ac.ContactID = c.ContactID JOIN 
          Person.utbZipCodes z ON z.ZipCodeID = a.ZipCodeID JOIN 
          Person.utbCitys city ON city.CityID = z.CityID JOIN 
          Person.utbContactUtbPhones cp ON c.ContactID = cp.ContactID JOIN 
          Person.utbPhones p ON p.PhoneID = cp.PhonesID JOIN 
          NonPros.utbNonProsUtbAddresses ea ON a.AddressID = ea.AddressID JOIN 
          aspnet_Membership m JOIN 
          NonPros.NonPros e ON m.UserId = e.UserID ON ea.NonProID = e.NonProID JOIN 
          BuildingPros.utbProfessionalsUtbNonPros pe ON e.NonProID = pe.NonProID JOIN 
          dbo.aspnet_Users u ON u.UserId = m.UserId 
       WHERE 
       CASE @Where 
         WHEN 'Email' THEN m.Email 
         WHEN 'Name'  THEN c.LastName    
         WHEN 'Zip'  THEN z.ZIPCode 
         WHEN 'ST'  THEN z.StateCD 
         WHEN 'Title' THEN c.Title 
         WHEN 'TimeZone' THEN z.TimeZone 
         WHEN 'City'  THEN city.City 
       END = @Equals 
+1

它看起來像'aspnet_Membership'上的連接被剪切並與其on子句奇怪地粘貼。這是電子郵件地址的來源。 – HABO

+2

我只想指出,在WHERE子句中使用這樣的CASE意味着優化器將無法使用索引構建高效計劃,我懷疑無論輸入如何,最終都會進行表掃描。您最好將查詢分成7個查詢,使用WHERE m.Email = @Equals等。運行哪個子查詢可由IF子句確定。如果你想進一步整理,你可以讓每個人都在子存儲過程中查詢。 –

+0

您還可以使用Like運算符進行字符串比較。 – Hiral

回答

4

我懷疑它適用於那些長度小於26個字符的電子郵件,並且在26個字符或更長的電子郵件上失敗。 VARCHAR(25)是不足以用於電子郵件地址。

+0

今天早上醒來時,那是我想過的拳頭。看看當我陷入代碼時會發生什麼。謝謝。 –

相關問題