Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带有子查询的case when语句的SQL查询错误_Sql_Sql Server_Subquery - Fatal编程技术网

带有子查询的case when语句的SQL查询错误

带有子查询的case when语句的SQL查询错误,sql,sql-server,subquery,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

我的存储过程:

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,16级,状态1,程序测试模板,第6行
子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时

使用以下输入执行时:

exec TEST_TEMPLATE 2
我在
WHERE
条件中使用
IN
子句,因为当
@Template\u Type
为“2”时,
Template\u可以应用于列
可以是值0和2中的任何一个。

您的错误在这里:

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

SELECT
语句返回多行数据。在我看来,
UDF\u DP\u SPLIT\u STRING
确实返回两个值,0和2返回错误。

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

UPDATE不能在类似记录集的
语句中使用标量变量。但是,如果这个变量只有一个数据值(我认为这就是您正在尝试做的事情),就可以了。
在这种情况下,@ahu-hau提供的使用等号“
TEMPLATE\u可以应用到=@TEMPLATE\u-TYPE
”的解决方案更好

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

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', ','))
     )
让我们看看这是否有帮助

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

SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2',',')),此SELECT语句返回>1条记录,您可能需要将其与key连接,以确保仅选择1条记录并输出iti,我希望从中有多条记录,这就是为什么where条件中有'In'子句。我知道,请阅读我的评论,了解我想表达的意思