我的存储过程:
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
语句中返回多个记录。为了实现您想要做的事情,您需要使用条件OR
和AND
语句,如下所示:
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,它们返回错误。