使用子查询语句时出现大小写查询错误



我的存储过程:

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
子查询返回多个值。当子查询紧跟在=、!=、<、<=、>、>=之后,或者当子查询用作表达式时,不允许这样做。

当有以下输入时执行:

exec TEST_TEMPLATE 2

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

让我们看看这是否有帮助

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

首先你不能在IN语句中使用INT变量,你需要在SELECT语句中使用表变量。

UPDATE不能在IN语句中使用标量变量,比如record set。然而,如果这个变量有一个单一的数据值(因为我认为这是你想做的)是OK的。在这种情况下,@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', ','))
     )

您的错误在这里:

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

SELECT语句返回不止一行的DATA。正如我所看到的,UDF_DP_SPLIT_STRING确实返回两个值,0和2,它们返回错误。

最新更新