2011-05-09 110 views
1
declare @temp varchar(20) 
declare @name varchar(20) 
set @name = 'John' 
set @temp = 'e' 
select * from TableA 
    where case when @temp = 'e' then [em_name] 
      case when @temp = 'c' then [company_name] 
     end 
      = @name 

此查詢給我錯誤(where子句中的非布爾表達式)。動態列名在where子句中

請解釋此查詢中出現了什麼問題,以及如何在沒有動態sql的情況下實現這一點。

所以當我給@temp = 'C'那麼它應該搜索[company_name] = @name。並有一長串@temp values(employee name, company name, city name, state name, supervisor name etc)

+0

可能重複[參數化存儲過程(http://stackoverflow.com/questions/5916748/parameterised-stored-proc) – 2011-05-09 05:41:48

回答

6

有一個在您發佈的剪斷語法錯誤:

where case when @temp = 'e' then [em_name] 
     case when @temp = 'c' then [company_name] 
    end 
     = @name 

應該是:

WHERE CASE WHEN @temp = 'e' THEN em_name 
     WHEN @temp = 'c' THEN company_name 
    END = @name 

注意現在只有一個CASE關鍵字。下面是比較常見的語法(完整性):

DECLARE @temp VARCHAR(20) 
DECLARE @name VARCHAR(20) 
SET @name = 'John' 
SET @temp = 'e' 

SELECT * 
FROM TableA 
WHERE (@temp = 'e' AND [em_name] = @name) 
    OR (@temp = 'c' AND [company_name] = @name) 
+0

這種方法是不錯,但查詢在SP中有6個地方使用。每個地方,哪個部分會有7個OR子句(這看起來很亂)。案例陳述清晰可辨。我把它從http://www.sqlservercentral.com/Forums/Topic717900-338-1.aspx但是查詢是給出錯誤。 – Raghav 2011-05-09 05:56:12

+0

我不確定7個WHEN子句是或多或少混亂,但其他維護者可能不太熟悉它。更新了我的答案。 – 2011-05-09 06:17:13

+0

謝謝傑克。 Case語句現在可以正常工作。在另一個選項(OR)中,變量@name出現的次數太多了,這種CASE與其他where子句條件一起使用。這給大括號帶來了複雜性。現在情況是完全可讀的,並與其他某些條款完全一致。 – Raghav 2011-05-09 08:10:56

2
SELECT * 
FROM TableA 
WHERE (@temp = 'e' AND [em_name] = @name) OR (@temp = 'c' AND [company_name] = @name)