带有子查询的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'子句。我知道,请阅读我的评论,了解我想表达的意思