带有子查询的语句时的SQL查询错误

时间:2014-08-18 07:48:26

标签: sql sql-server subquery

我的存储过程:

CREATE PROCEDURE TEST_TEMPLATE 
@TEMPLATE_TYPE INT=NULL
AS
BEGIN
   SELECT 
      TEMPLATE_ID,
      TEMPLATE_NAME    
   FROM 
      BDC_TEMPLATES
   WHERE 
      TEMPLATE_CAN_BE_APPLIED_TO IN (
            CASE 
              WHEN @TEMPLATE_TYPE=0 OR @TEMPLATE_TYPE=1 THEN  @TEMPLATE_TYPE  -- 0:EMAIL & LETTER , 1: EMAIL              
              WHEN @TEMPLATE_TYPE=2 THEN (SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ',')) -- 2: LETTER
              ELSE TEMPLATE_CAN_BE_APPLIED_TO             
            END)  
END

以上存储过程返回以下错误:

  

Msg 512,Level 16,State 1,Procedure TEST_TEMPLATE,Line 6
  子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。

使用以下输入执行时:

exec TEST_TEMPLATE 2

我在IN条件中使用WHERE子句,因为当@Template_Type为'2'时,Template_can_be_applied_to column可以是值0和2中的任何一个。 / p>

3 个答案:

答案 0 :(得分:1)

让我们看看这个帮助

CREATE PROCEDURE TEST_TEMPLATE 
@TEMPLATE_TYPE INT=NULL
AS
BEGIN
SELECT TEMPLATE_ID,
        TEMPLATE_NAME    
        FROM BDC_TEMPLATES
WHERE (TEMPLATE_CAN_BE_APPLIED_TO = @TEMPLATE_TYPE AND (@TEMPLATE_TYPE=0 OR @TEMPLATE_TYPE=1))
OR (TEMPLATE_CAN_BE_APPLIED_TO IN(SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ',') AND @TEMPLATE_TYPE=2)
OR (@TEMPLATE_TYPE>3)

END

答案 1 :(得分:0)

您的错误在这里:

 WHEN @TEMPLATE_TYPE=2 THEN (SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ','))

SELECT语句返回多行DATA。在我看来,UDF_DP_SPLIT_STRING确实返回两​​个值,0和2返回错误。

答案 2 :(得分:0)

首先,您不能将INT变量与IN语句一起使用,您需要将表变量与SELECT语句一起使用。

UPDATE 您不能在IN语句中使用标量变量,例如记录集。但是,如果此变量具有单个数据值(我认为这是您要执行的操作),那么就可以了。 在这种情况下,@ ah_hau提供的使用等号“TEMPLATE_CAN_BE_APPLIED_TO = @TEMPLATE_TYPE”的解决方案更好。

其次,您不能在CASE语句中返回多个记录。为了实现您的目标,您需要使用条件ORAND语句,如下所示:

WHERE (
       (@TEMPLATE_TYPE=0 OR @TEMPLATE_TYPE=1) 
        AND TEMPLATE_CAN_BE_APPLIED_TO IN (SELECT col FROM [your table variable])
      ) 
OR   (
       @TEMPLATE_TYPE=2 
   AND TEMPLATE_CAN_BE_APPLIED_TO IN (SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ','))
     )