2014-03-05 87 views
0

我有一個存儲過程,我通過一個逗號分隔的ID,我在where子句中使用此語句與'IN'的case語句。子查詢返回的值超過1。與SQL Server 2012中的where子句

我得到這個錯誤:

「子查詢返回多個值。當子查詢遵循=,!=,<,< =,>,> =或子查詢用作表達式時,這是不允許的。

我的程序是

ALTER Proc [dbo].[proc_generatdetail] 
    @TagIds varchar(1000) 
    @IsMinStock bit, 
    @Tags varchar(1000) 
AS 
BEGIN 
    SELECT 
     IMd.ItemCode, I.ITEM_No 
    FROM 
     Item I 
    LEFT JOIN 
     tblItemSize ITS ON I.ITEMCode = ITS.ItemId 
         AND I.BranchId = ITS.BranchId   
    WHERE 
     CASE 
      WHEN @Tags IS NOT null 
       THEN ITS.SizeId 
      ELSE 1 END IN 
       (case when @Tags is not null then (select id from CSVToTable(@TagIds)) else (1) end) 

END 

CSVToTabes returs ID的表,我也沒有用,如果 - else條件。 因此,如果任何人有,請給這個解決方案。

回答

2

這是您的查詢:

select IMd.ItemCode, I.ITEM_No 
from Item I left join 
    tblItemSize ITS 
    on I.ITEMCode = ITS.ItemId and 
     I.BranchId = ITS.BranchId   
where case when @Tags IS NOT null 
      then ITS.SizeId else 1 
     END in (case when @Tags is not null then (select id from CSVToTable(@TagIds)) else (1) end) 

一個case語句返回同樣的事情各方面的條件。而且,它不能返回一個集合。剛剛改寫的邏輯沒有case

select IMd.ItemCode, I.ITEM_No 
from Item I left join 
    tblItemSize ITS 
    on I.ITEMCode = ITS.ItemId and 
     I.BranchId = ITS.BranchId   
where (@Tags is null) or 
     (ITS.SizeId in (select id from CSVToTable(@TagIds)) 

的邏輯是更容易理解爲好。

有一種情況,你會想要case。這是當函數返回一個錯誤,如果給出一個NULL參數。然後你可以這樣說:

where 1 = (case when @Tags is null then 1 
       when ITS.SizeId in (select id from CSVToTable(@TagIds) then 1 
       else 0 
      end) 
+0

非常感謝你親愛的,現在它適用於我... –

相關問題