【问题标题】:SQL query error from case when statement with subquery带有子查询的语句时的 SQL 查询错误
【发布时间】:2014-08-18 07:48:26
【问题描述】:

我的存储过程:

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

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

消息 512,级别 16,状态 1,过程 TEST_TEMPLATE,第 6 行
子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

当使用以下输入执行时:

exec TEST_TEMPLATE 2

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

【问题讨论】:

  • SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ','),此选择语句返回 > 1 条记录,您可能需要将其与 key 连接以确保仅选择并输出 1 条记录它
  • 我期望从那里获得多个记录,这就是为什么我在 where 条件中有 'In' 子句。

标签: sql sql-server subquery


【解决方案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

【讨论】:

    【解决方案2】:

    首先你不能在IN语句中使用INT变量,你需要在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', ','))
         )
    

    【讨论】:

      【解决方案3】:

      你的错误在这里:

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

      SELECT 语句返回多于一行的 DATA。如我所见,UDF_DP_SPLIT_STRING 确实返回了两个值,0 和 2,它们返回了错误。

      【讨论】:

      • 我知道这一点,请阅读我的评论,了解我想要实现的目标
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-19
      • 2023-02-21
      • 2018-09-13
      • 1970-01-01
      相关资源
      最近更新 更多