我的存储过程:
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
子查询返回的值超过1。当子查询遵循=,!=,<,< =,>,> =或子查询用作表达式时,不允许这样做。
使用以下输入执行时:
exec TEST_TEMPLATE 2
我在IN
条件中使用WHERE
子句,因为当@Template_Type
为'2'时,Template_can_be_applied_to column
可以是值0和2中的任何一个。 / p>
答案 0 :(得分: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
答案 1 :(得分:0)
您的错误在这里:
WHEN @TEMPLATE_TYPE=2 THEN (SELECT DATA FROM UDF_DP_SPLIT_STRING('0,2', ','))
SELECT
语句返回多行DATA。在我看来,UDF_DP_SPLIT_STRING
确实返回两个值,0和2返回错误。
答案 2 :(得分:0)
首先,您不能将INT
变量与IN
语句一起使用,您需要将表变量与SELECT
语句一起使用。
UPDATE 您不能在IN
语句中使用标量变量,例如记录集。但是,如果此变量具有单个数据值(我认为这是您要执行的操作),那么就可以了。
在这种情况下,@ 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', ','))
)