2014-03-05 49 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

非常感谢你亲爱的,现在它适用于我... –

相关问题