子查询返回的值超过1。与SQL Server 2012中的where子句

时间:2014-03-05 11:36:21

标签: sql sql-server sql-server-2012

我有一个存储过程,我在其中传递逗号分隔的id,我在where子句中使用它,case语句带有'IN'。

我收到此错误:

  

'子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。'

我的程序是

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重写了id表,我不必使用if - else条件。 如果有人的话,请为此提供解决方案。

1 个答案:

答案 0 :(得分: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)